summaryrefslogtreecommitdiffhomepage
path: root/.agents/skills/build-and-verify/SKILL.md
blob: f23b6aa8cb12589dd6675648508f427e4aa5f39e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
---
name: build-and-verify
description: Use to build and verify a change end-to-end. The canonical sequence for this repo — PATH strip, incremental desktop build (with the mruby-rebuild caveat), smoke test, offscreen-render visual check, web build, and node headless smoke test. There is no unit-test harness; verification is by running scripts.
---

# Build and verify a change

Mirrors `.agents/knowledge/testing.md`. There is no unit-test harness — you verify
by running `.rb` scripts through the built binary (`main.c` runs `argv[1]`).

## Steps

1. **PATH:** strip `/mnt/c` (`.agents/rules/wsl-toolchain.md`). The build scripts
   already do this; if you call `ruby`/`rake` directly, do it yourself.
2. **Type check (Ruby/sig changes):** `./tools/check-types.sh` — runs `rbs
   validate` (sig consistency) + `steep check` (Steep project loads clean, no
   :error). Cheap, needs no build. Green on correct code; hard-fails on a broken
   `sig/*.rbs` or a Steep project-load error. (Game-code type *typos* surface as
   :information in the editor / `steep check --severity-level=information`, not
   here — see `.agents/knowledge/steep.md`.) Skip if you only touched C/C++.
3. **Desktop build:** `./rebuild.sh` (rake `libmruby.a` → `zig build`). Full build:
   `zig build`. **After adding/removing an mrbgem or flipping the C/C++ ABI:**
   `rm -rf vendor/mruby/build` first (`.agents/rules/mruby-rebuild.md`), else
   "multiple definition" link errors.
4. **Smoke test:** write a small `.rb` that `puts` results to
   `/tmp/opencode/smoke.rb`, run `./zig-out/bin/game /tmp/opencode/smoke.rb`, and
   filter the banner: pipe through `grep -vE '^(INFO|WARNING|MESA|libEGL)'`. Diff
   output against expected.
5. **Visual check (offscreen):** set `Rl::FLAG_WINDOW_HIDDEN`, draw one frame, read
   pixels back (`load_image_from_screen` / `get_image_color`, or `export_image` /
   `take_screenshot`) and assert on values (e.g. a tint × 255). Delete the PNG
   after — `*.png` is git-ignored, don't commit it.
6. **Web build:** `EMSDK_ENV=~/emsdk/emsdk_env.sh ./build_web.sh`. Switching
   desktop↔web rebuilds raylib and `make clean`s its shared `.o` files; if you ever
   build raylib by hand, clean between targets (`.agents/rules/raylib-platform-objs.md`).
7. **Web smoke:** `node build/web/game.js /game/script.rb` (windowless logic). A
   **windowed** script stopping at `glfwInit` ("window is not defined") is the
   expected browser-only boundary, not a failure. Validate flecs/logic on desktop
   first (fast), then confirm on wasm to catch stack/alignment issues.

## Cross-refs
- Knowledge: `.agents/knowledge/testing.md`, `build-system.md`, `environment.md`, `web-target.md`
- Rules: all of `.agents/rules/`