- the test runner re-makes every state between tests again: since 12fdc07 a state is made by its getter on
first use, so re-running L_init_globals left the last test's state in place (state/tested failed its
second test); @L_reset_states forgets every lazy state, and the runner calls it before each test
- diag_json_case counts errors, and an absent @Ref / @Tint / @OneOf target is a warning since d82dc31:
ref_unknown is 1 error and node_bad 8
- schema_hash.ludic prints 1: a bool is 1 or 0 as text (random_plain's 1 1 1)
- permap_check_case looks for the unit warning without the quotes the JSON escapes
- baked_test's inputs-hash test makes its directory: each test has a temp directory of its own
- ludic deps prints phase 25's five counters too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What is deterministic is made at build time by the game's own code (`ludic bake`) and read at run
time. baked.ludic, baked_hash.ludic, baked_stream.ludic:
- The header, 32 bytes little-endian: "LBAK" | u32 format (BAKE_FORMAT 1) | u32 generator version |
u32 payload offset | u64 inputs hash | u64 payload length | then the key (UTF-8, zero-padded to 8),
then the payload at its offset, whose layout is the bake's own.
- bake_write(path, key, version, inputs_hash, payload, n) makes the directories and writes it;
bake_inputs_hash(inputs) is FNV-1a 64 over each space-separated input: its path, a 0, its bytes.
- baked_open(path, key, version) -> []byte: the payload as a view of the file (no copy), or null for
a missing file or another format, key or version. The runtime never hashes inputs; `ludic bake
--check` holds a baked file to them at build time.
- baked_open_range(path, key, version) -> BakedFile kept open (header checked once),
baked_read(bf, at, n, into) -> count read into the caller's buffer from payload offset `at`
(held to the buffer and the payload), baked_len, baked_close: a streamed bake (placements by chunk,
terrain by tile) with nothing made per read. Pack-aware through file_open: on macOS a packed entry
is an fmemopen over the mapped pack (a seek is free), on Windows a temporary copy of the entry made
once when it is opened.
- baked_path(map, file), bake_missing(bake_st, key) (a dev build's line, once a key).
tests/baked_test.ludic: a payload round-trips for its key and version only, a streamed read at an
offset and one past the end, the inputs hash follows path and bytes. Written, type-checked, not run
(compile-only rule).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>