engine(macos-arm64): 4.7 native-module build + ship GodotSharp; add update-engine skill

- Replace macOS binary with the 4.7 build where Terrain3D + agent_skinned are native
  engine modules (no GDExtension .framework). Fixed C# bindability (set_plugin->Object,
  abstract Terrain3DAssetResource, drop dup duplicate bind) so glue generates.
- SHIP GodotSharp alongside the binary (matched pair) — stale/missing GodotSharp causes
  "Wrapper class not found for Terrain3D" / ".NET assemblies not found". Engine does not
  regenerate it. Un-ignore GodotSharp in .gitignore.
- manifest.json: macOS -> 4.7 (4ba7b5b) + new sha + godotsharp field; drop obsolete
  terrain_3d GDExtension section; windows flagged 4.7-pending.
- Add .agents/skills/update-engine (mac+win self-serve install) + README + Forge handoff.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-19 02:35:00 +01:00
parent cf4a8bc6e3
commit b0810fbdfd
79 changed files with 421 additions and 34 deletions
+62
View File
@@ -0,0 +1,62 @@
# Handoff → Forge (Ozan's Windows box): build Windows 4.7 + ship GodotSharp
**Date:** 2026-06-19 · **From:** macOS 4.7 native-module migration · **For:** Windows build owner
## Why
The engine moved to **Godot 4.7** and **Terrain3D + agent_skinned are now native engine modules**
(compiled into the binary — no GDExtension `.framework`). macOS is done and shipped in this repo
(`engine/macos-arm64/`). **Windows is still 4.6.5 with the GDExtension** and must be brought up to
4.7 the same way, or Windows teammates can't run the new `ariki-game` (the game-side cutover removed
the terrain GDExtension).
## The critical bit (don't skip)
After the 4.7 build you **must regenerate GodotSharp and ship it next to the binary.** A native
module changes the engine's class list; the C# bindings (`GodotSharp`) must be regenerated to
include `Terrain3D` / `MultiSkinnedMeshInstance3D`, or the game throws
`Wrapper class not found for type: Terrain3D` (terrain = water, animals frozen). The engine does
**not** regenerate GodotSharp at runtime.
## Steps (Windows)
1. **Sync engine source** to the current `tinqs/engine` `main` (single 4.7 snapshot, `4ba7b5b`).
```
cd engine
tinqs pull # or: git fetch origin && git checkout main && git reset --hard origin/main
```
2. **Build the editor**:
```
scons platform=windows target=editor arch=x86_64 module_mono_enabled=yes
scons platform=windows target=editor arch=x86_64 module_mono_enabled=yes windows_subsystem=console # console binary
```
3. **Regenerate the mono glue + GodotSharp assemblies** (this is the step that fixes the wrapper errors):
```
bin\tinqs.windows.editor.x86_64.mono.exe --headless --generate-mono-glue modules\mono\glue
python modules\mono\build_scripts\build_assemblies.py --godot-output-dir=bin --godot-platform=windows
```
Confirm `bin\GodotSharp\Api\Debug\GodotSharp.dll` exists and that
`modules\mono\glue\...\Generated\Constructors.cs` contains `Terrain3D` (grep it).
4. **If you hit the same build errors I did** (already fixed in `main`, but for reference): a core
module can't expose an editor-API type — `Terrain3D::set_plugin` must take `Object*` not
`EditorPlugin*`; `Terrain3DAssetResource` must be `GDREGISTER_ABSTRACT_CLASS`; drop the redundant
`Terrain3DRegion::duplicate` bind. These are already in `main` — a clean pull should have them.
5. **Drop into this builds repo** (`engine/windows-x64/`):
- `tinqs.windows.editor.x86_64.mono.exe` (+ `.console.exe`)
- the whole `GodotSharp/` folder ← **new requirement; was previously .gitignored**
6. **Update `manifest.json`** windows-x64 block: version `4.7…`, `engine_commit` `4ba7b5b`, new
sha256s, add `"godotsharp": "engine/windows-x64/GodotSharp"`, clear the "pending" note.
7. `tinqs push`.
## Verify
On a Windows machine with `ariki-game`: run the update-engine skill (`.agents/skills/update-engine`,
Windows path), launch `game.sh run`. Healthy = terrain renders, animals animate, **0**
`Wrapper class not found`, no `.NET assemblies not found`.
## Notes
- `.gitattributes` already LFS-tracks `engine/**`, so the binary + GodotSharp go to LFS automatically.
- The macOS side in this repo is the reference for exactly what the layout should look like.
- Game-side cutover (GDExtension removal, `project.godot`→4.7) is committed on `ariki-game` `main`
(held pending team sync) — Windows teammates need this engine before that lands for them.
+89
View File
@@ -0,0 +1,89 @@
---
name: update-engine
description: Install/update the local Tinqs engine (binary + GodotSharp C# bindings) from this builds repo so ariki-game runs on the current engine. Use when an engine update is announced, when setting up a new machine, or when the game shows ".NET assemblies not found" or "Wrapper class not found for type: Terrain3D" (terrain is water / animals don't animate). Covers macOS (arm64) and Windows (x64).
---
# Update the Tinqs engine from `builds`
**Only Ozan edits the engine source.** Everyone else installs the prebuilt engine from this
repo into `../engine/bin/`, which is where `ariki-game` looks for it.
## ⚠️ Read this first — binary + GodotSharp are a MATCHED PAIR
The engine binary and its `GodotSharp/` folder (Godot's C# bindings) are **both generated from the
same engine source** and must be installed **together**. The binary does **not** regenerate
`GodotSharp` — it must sit next to the binary on disk. Mismatch symptoms:
| Symptom | Cause |
|---|---|
| `.NET assemblies not found` dialog (looks for `engine/bin/GodotSharp/Api/Debug`) | no `GodotSharp` present |
| `Wrapper class not found for type: Terrain3D` / `MultiSkinnedMeshInstance3D` — terrain renders as water, animals don't animate | **stale** `GodotSharp` from an older engine that predates the built-in Terrain3D / agent_skinned modules |
So: always **replace `GodotSharp` wholesale** when you take a new binary, and clear the game's C#
cache so it rebuilds against the new bindings.
## Assumed layout
```
tinqs-ltd/
ariki-game/ ← the game (looks for ../engine/bin/…)
engine/bin/ ← install target: binary + GodotSharp live here
builds/ ← this repo (prebuilt engine)
```
Adjust paths below if your checkout differs.
## 1. Pull the latest build
```bash
cd <…>/builds
tinqs pull # never `git pull` — tinqs handles LFS (the binary + GodotSharp are LFS)
```
Check `builds/manifest.json` for the current version/commit per platform.
## 2a. Install — macOS (arm64)
```bash
BUILDS="<…>/builds"; ENGINE="<…>/engine/bin"; GAME="<…>/ariki-game"
mkdir -p "$ENGINE"
# 1) binary
cp "$BUILDS/engine/macos-arm64/tinqs.macos.editor.arm64.mono" "$ENGINE/"
chmod +x "$ENGINE/tinqs.macos.editor.arm64.mono"
# 2) GodotSharp — REPLACE wholesale (matched pair)
rm -rf "$ENGINE/GodotSharp"
cp -R "$BUILDS/engine/macos-arm64/GodotSharp" "$ENGINE/GodotSharp"
# 3) clear the game's stale C# cache
rm -rf "$GAME/.godot/mono"
```
## 2b. Install — Windows (x64), PowerShell
```powershell
$builds="<…>\builds"; $engine="<…>\engine\bin"; $game="<…>\ariki-game"
New-Item -ItemType Directory -Force -Path $engine | Out-Null
# 1) binaries
Copy-Item "$builds\engine\windows-x64\tinqs.windows.editor.x86_64.mono.exe" $engine -Force
Copy-Item "$builds\engine\windows-x64\tinqs.windows.editor.x86_64.mono.console.exe" $engine -Force
# 2) GodotSharp — REPLACE wholesale (matched pair)
Remove-Item -Recurse -Force "$engine\GodotSharp" -ErrorAction SilentlyContinue
Copy-Item -Recurse "$builds\engine\windows-x64\GodotSharp" "$engine\GodotSharp"
# 3) clear the game's stale C# cache
Remove-Item -Recurse -Force "$game\.godot\mono" -ErrorAction SilentlyContinue
```
## 3. Verify
```bash
"$ENGINE/tinqs.macos.editor.arm64.mono" --version # matches manifest.json
ls "$ENGINE/GodotSharp/Api/Debug/GodotSharp.dll" # MUST exist
```
Then run the game (`cd ariki-game && bash tools/game.sh run`). Healthy = terrain renders, animals
animate, log shows **0** `Wrapper class not found` and no `.NET assemblies not found` dialog.
## Notes
- **GodotSharp must be present in this repo for the copy to work.** If `builds/engine/<platform>/GodotSharp`
is missing, the build owner needs to add it (it ships *with* the binary — see `manifest.json`).
- Don't mix a new binary with an old `GodotSharp`. Always replace both, together.
- Terrain3D and the skinned-animation classes are **built into the engine binary** now (no separate
`addons/terrain_3d` GDExtension `.framework`). If you still have `addons/terrain_3d/terrain.gdextension`
or the macOS `.framework`, remove them — they conflict with the built-in module.
+3 -2
View File
@@ -1,2 +1,3 @@
# Locally-extracted engine runtime (GodotSharp C# assemblies) not tracked
engine/windows-x64/GodotSharp/
# GodotSharp (the engine's C# bindings) IS now tracked and shipped alongside each binary.
# It is a matched pair with the binary — see README.md / .agents/skills/update-engine.
# (Previously windows-x64/GodotSharp was ignored; that was wrong — teammates need it.)
+35 -6
View File
@@ -1,11 +1,40 @@
# tinqs/builds
Build artifacts for the Tinqs stack — engine editor binaries and game exports.
**Binaries are stored via Git LFS** (see `.gitattributes`). Source lives in `tinqs/engine`,
`tinqs/ariki-game`, `tinqs/ariki-sim`. See `manifest.json` for what's here.
Build artifacts for the Tinqs stack — engine editor binaries (+ their GodotSharp C# bindings).
**Binaries and GodotSharp are stored via Git LFS** (see `.gitattributes`). Source lives in
`tinqs/engine`, `tinqs/ariki-game`, `tinqs/ariki-sim`. See `manifest.json` for exact versions.
Long-term plan: CI (Gitea Actions) builds on push and publishes here / to S3 — see
`docs/ai/plans/build-pipeline-architecture-2026-06-07.md`.
> **Use `tinqs pull` / `tinqs push`, never raw git** — these are LFS-heavy.
## Installing / updating the engine
**Don't copy files by hand — run the skill:** [`.agents/skills/update-engine`](.agents/skills/update-engine/SKILL.md).
Hand it to your agent; it installs the binary + GodotSharp into `../engine/bin/`, wipes stale
caches, and verifies. Covers macOS + Windows.
## ⚠️ The one rule: binary + GodotSharp are a MATCHED PAIR
Each engine binary ships with a `GodotSharp/` folder (Godot's C# bindings) **generated from that
exact engine build**. You must install them **together** and replace any old `GodotSharp`.
- The engine does **NOT** regenerate GodotSharp at runtime. If it's missing you get a
**`.NET assemblies not found`** dialog pointing at `engine/bin/GodotSharp/Api/Debug`.
- A **stale** GodotSharp (from an older engine) against a newer binary throws
**`Wrapper class not found for type: Terrain3D`** → terrain renders as water, animals don't animate.
This matters now because **Terrain3D and `agent_skinned` are native engine modules** (no separate
`addons/terrain_3d` GDExtension `.framework`). Built-in module classes need their wrappers baked
into GodotSharp, so GodotSharp had to be regenerated — and must ship here alongside the binary.
## Current contents
- `engine/macos-arm64/tinqs.macos.editor.arm64.mono` — Godot 4.6.3 fork editor (mono), built on Kraken with Xcode 26.3.
| Platform | Engine | Terrain3D | GodotSharp shipped? |
|---|---|---|---|
| `engine/macos-arm64/` | **4.7** (`4ba7b5b`) — native modules | built-in module | ✅ yes (`GodotSharp/`) |
| `engine/windows-x64/` | **4.6.5** (`420e74bf8`) — still GDExtension | GDExtension | ❌ pending — see handoff |
**Windows is not yet on 4.7.** The 4.7 Windows build + its GodotSharp must come from Forge —
see [`.agents/handoffs/forge-windows-4.7.md`](.agents/handoffs/forge-windows-4.7.md).
Long-term: CI (Gitea Actions) builds on push and publishes here / to S3 —
`docs/ai/plans/build-pipeline-architecture-2026-06-07.md`.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+11 -24
View File
@@ -1,21 +1,25 @@
{
"_install": "Use the update-engine skill (.agents/skills/update-engine) — it installs the binary AND GodotSharp together into ../engine/bin and clears stale caches. GodotSharp ships WITH the binary (matched pair); the engine does NOT regenerate it.",
"engine": {
"macos-arm64": {
"binary": "engine/macos-arm64/tinqs.macos.editor.arm64.mono",
"version": "4.7.stable.mono.custom_build.8d56dbe70",
"godotsharp": "engine/macos-arm64/GodotSharp",
"version": "4.7.stable.mono.custom_build.e26d9949c",
"engine_repo": "tinqs/engine",
"engine_commit": "8d56dbe",
"sha256": "17e2f3c084fee797400d7f00c4ba5df297f268fbad33a63b2b05dc1914732218",
"engine_commit": "4ba7b5b",
"sha256": "5058245b24e1040dc39fe532843670ee1fce4c84e79e122bae762a51c08c52d1",
"target": "editor",
"built_on": "2026-06-18",
"built_by": "Kraken (local build — Godot 4.7-stable rebased with Tinqs branding + 10 agent modules + terrain3d)",
"built_on": "2026-06-19",
"built_by": "Claude (4.7 native-module fix — Godot 4.7-stable + Tinqs branding + 10 agent modules + Terrain3D & agent_skinned as NATIVE engine modules)",
"toolchain": "Xcode 26.3 (Apple clang 17)",
"scons_flags": "platform=macos target=editor arch=arm64 module_mono_enabled=yes vulkan_sdk_path=~/VulkanSDK/1.4.350.0/macOS",
"note": "Editor binary, engine 8d56dbe (4.7.0). Base: Godot 4.7-stable. Tinqs branding layer (banner/version/strings/Windows renames) + modules/agent_* (10) + vendored terrain3d (border-NaN patch). 4.7 migration fixes: callable_mp.h + class_db.h includes (4.7 decoupled transitive includes), macOS SCsub #bin/tinqs. Build green (9:18 + 10s relink). ⚠️ terrain_3d GDExtension NOT yet rebuilt for 4.7 ABI — ariki-game must rebuild terrain3d against 4.7 headers before switching off 4.6. Windows 4.7 build pending from Forge (still 4.6.4 below)."
"note": "Terrain3D is now a NATIVE ENGINE MODULE (no separate GDExtension .framework). 4.7 C#-bindability fixes: Terrain3D::set_plugin EditorPlugin*->Object*, Terrain3DAssetResource registered abstract, dropped redundant Terrain3DRegion::duplicate bind — so GodotSharp glue generates wrappers for all module classes. GodotSharp REGENERATED + shipped here alongside the binary (matched pair: a stale GodotSharp -> 'Wrapper class not found for Terrain3D'). Verified: terrain renders, animals GPU-driven, 0 wrapper errors. Note: binary's baked version-hash reads e26d9949c (built before the engine history was flattened to single commit 4ba7b5b); same compiled code.",
"version_hash_note": "engine main is the single 4.7 snapshot 4ba7b5b; the binary predates the flatten so --version prints e26d9949c"
},
"windows-x64": {
"binary": "engine/windows-x64/tinqs.windows.editor.x86_64.mono.exe",
"console_binary": "engine/windows-x64/tinqs.windows.editor.x86_64.mono.console.exe",
"godotsharp": "engine/windows-x64/GodotSharp (NOT YET SHIPPED — see .agents/handoffs/forge-windows-4.7.md)",
"version": "4.6.5.stable.mono.custom_build.420e74bf8",
"engine_repo": "tinqs/engine",
"engine_commit": "420e74bf8e",
@@ -25,24 +29,7 @@
"built_on": "2026-06-16",
"built_by": "Forge (Ozan's Windows box — local build)",
"toolchain": "MSVC VS BuildTools 2022 (vcvarsall amd64), SCons 4.10.1, mono glue + GodotSharp assemblies",
"scons_flags": "platform=windows target=editor module_mono_enabled=yes",
"note": "Branded editor binary. Built from engine 420e74bf8e (agent_skinned mat4x3 palette, far-LOD dominant-bone, set_bone_matrices, crowd-engine-roadmap). 4.6.5. Console binary included."
}
},
"terrain_3d": {
"macos-arm64": {
"debug_framework": "engine/macos-arm64/terrain_3d/bin/libterrain.macos.debug.framework",
"release_framework": "engine/macos-arm64/terrain_3d/bin/libterrain.macos.release.framework",
"sha256_debug": "653a16ffdc3e6bb05cf514b9700c943c8694133e28ec65800d074c58c13ea216",
"sha256_release": "ca16b2a6afa80c382ffd578ebb6b31ce456a251ef8642e7d1addba79ef51d564",
"engine_repo": "tinqs/engine",
"engine_commit": "bb8fe2f",
"built_against_engine_binary": "de00a306c",
"built_on": "2026-06-09",
"built_by": "Kraken",
"fix": "get_height no longer returns NaN at region borders.",
"install": "cp -R engine/macos-arm64/terrain_3d/bin/libterrain.macos.*.framework <ariki-game>/addons/terrain_3d/bin/",
"note": "GDExtension only — no engine rebuild needed."
"note": "⚠️ STILL 4.6.5 — NOT the 4.7 native-module engine. Windows 4.7 build (with Terrain3D as a module + regenerated GodotSharp shipped alongside) is PENDING from Forge. See .agents/handoffs/forge-windows-4.7.md. Until then, Windows teammates stay on 4.6.5 + the GDExtension terrain."
}
}
}