ludic/changes
Orkuncakilkaya e738741521 feat(cli): ludic deps - the module graph as the compiler resolved it
With LUDIC_DEPS=<file> the compiler records every reference the
visibility pass resolves (from module, to module) and every assignment
to another module's global. ludic deps prints the modules,
dependencies, largest cycle, cross writes and globals written from
outside, with --graph, --dot, --writes, --uses MOD, --check FILE and
--baseline FILE. Reseed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 11:16:34 +03:00
..
a-hidden-body-still-stands-in-the-sun.md fix(render3d): a body hidden from the camera still stands in the sun 2026-09-19 21:32:11 +03:00
a-leaf-is-not-matte.md fix(render3d): a leaf is not matte 2026-09-19 16:41:33 +03:00
a-lens-and-an-edge.md feat(render3d): anti-aliasing that exists, and a lens for the viewfinder 2026-09-19 17:38:25 +03:00
an-aspen-quakes.md feat(render3d): an aspen quakes, and a tree is no longer bent like a bow 2026-09-19 21:13:42 +03:00
build-ir-in-temp.md fix(cli): build's IR goes to the run's temp directory, not the project 2026-09-23 17:29:55 +03:00
contact-darkening.md feat(render3d): the lake answers to a body standing in it 2026-09-19 20:23:27 +03:00
declared-namespaces.md feat(lang): L6 namespaces declared in Ludic - alias 2026-09-24 02:40:57 +03:00
def-from-resource.md feat(lang): def REGISTRY from "file.lres" - a game fills an open registry from its own file 2026-09-25 07:22:05 +03:00
defaults-views-templates.md feat(ui): ui_scale and ui_box, on-submit, zoom (and a length over a length in calc), on-hold 2026-09-25 03:31:38 +03:00
duplicate-definitions.md feat(lang): a name is defined once, a local once per block, and a result is always returned 2026-09-23 23:55:20 +03:00
engine-alias-shadow.md fix(lang): a function named like an engine namespace method's target is refused 2026-09-25 05:14:45 +03:00
expect-floats.md fix(test): expect_eq and expect_near compare floats as floats 2026-09-25 05:06:15 +03:00
friend-of.md feat(lang): friend module lab of fishing, data - a friend of the modules it names 2026-09-25 04:12:47 +03:00
function-values.md feat(lang): functions are values (L2), and render3d takes its scene as callbacks 2026-09-24 00:27:26 +03:00
generics.md feat(lang): L5 generic records and functions 2026-09-24 02:21:15 +03:00
leaves-light-and-the-bole.md fix(runtime): the wheel on macOS did nothing, or everything 2026-09-20 01:24:37 +03:00
lexer-literals.md fix(lang): a template inside another's hole, and integer literals past 2^31 - 1 2026-09-25 08:10:46 +03:00
light-air-and-the-hour.md feat(render3d): the air and the light are the hour's, not one constant apiece 2026-09-19 14:42:30 +03:00
light-you-can-see.md feat(render3d): light you can see - sun shafts and valley mist 2026-09-19 16:06:16 +03:00
lint.md feat(tools): L10 ludic-fmt enforces a project's style 2026-09-24 14:38:35 +03:00
listener-return.md fix(events): a listener's return ends that listener, not the dispatch 2026-09-23 17:42:18 +03:00
ludic-deps.md feat(cli): ludic deps - the module graph as the compiler resolved it 2026-09-25 11:16:34 +03:00
ludic-lab.md feat(ludic.lab): the visual lab as a package - a scene on a plate, never a world 2026-09-25 07:48:43 +03:00
module-scope.md feat(lang): L3 module scope - module, export, friend module 2026-09-24 00:52:12 +03:00
module-uses.md feat(lang): module NAME uses A, B - a module reaches only the modules it names 2026-09-25 04:06:45 +03:00
numbers-float-strict.md feat(lang): strict numbers in float files; render3d on float 2026-09-23 17:13:25 +03:00
numbers-float.md feat(lang): numbers float - a module whose decimal literals are float 2026-09-23 16:02:11 +03:00
one-wind.md feat(render3d): one wind, and everything in the valley is moved by it 2026-09-19 18:24:43 +03:00
open-registry.md feat(lang): open registry - other modules' defs, in an order imports cannot change 2026-09-25 04:28:34 +03:00
ports.md feat(lang): ports - port Clock { ... } in a module, bind Clock { ... } in the app 2026-09-25 04:20:12 +03:00
private-kinds.md feat(lang): a module's private records and events are its own 2026-09-25 11:02:48 +03:00
private-per-module.md feat(lang): a module's private names are its own 2026-09-25 07:08:05 +03:00
rain-that-leaves-something.md feat(render3d): rain that leaves something behind 2026-09-19 19:43:29 +03:00
README.md refactor(cli)!: split the contributor tool out of the ludic CLI 2026-09-05 23:15:12 +03:00
redeclared-local-missing-return.md feat(lang): a name is defined once, a local once per block, and a result is always returned 2026-09-23 23:55:20 +03:00
registries.md feat(lang): L8 registries by declaration - registry and def 2026-09-24 13:34:51 +03:00
render3d-hooks.md feat(lang): functions are values (L2), and render3d takes its scene as callbacks 2026-09-24 00:27:26 +03:00
resources.md feat(lang): L9 resource files - registry ... from 2026-09-24 14:00:20 +03:00
runtime-on-call.md fix(runtime): Random.* in any program; value_* called directly brings the value tree 2026-09-25 04:59:48 +03:00
still-water.md fix(render3d): the meadow is vegetation, and still water reads as water 2026-09-19 18:07:01 +03:00
test-generics.md fix(test): a generic function called from a test block works 2026-09-25 04:46:08 +03:00
test-per-process.md feat(test): ludic test <dir>, each test block in a process of its own 2026-09-25 04:39:55 +03:00
text-to-float.md feat(text): Text.to_float; a void function's return <value> is an error 2026-09-23 19:19:28 +03:00
the-ground-up-close.md fix(render3d): the ground keeps more of its own colour, and the rock keeps all of it 2026-09-19 16:29:17 +03:00
the-world-knows-you-are-there.md feat(render3d): the lake answers to a body standing in it 2026-09-19 20:23:27 +03:00
type-checker.md feat(lang): L4 type checker between parse and emit 2026-09-24 01:34:49 +03:00
unsafe.md feat(lang): L7 memory is safe unless it says unsafe 2026-09-24 12:53:27 +03:00
uses-packages.md feat(lang): packages count under uses; a port of defaults may go unbound 2026-09-25 05:36:11 +03:00
void-return-error.md feat(text): Text.to_float; a void function's return <value> is an error 2026-09-23 19:19:28 +03:00

Changesets

A changeset is one small Markdown file describing a single user-facing change, dropped in this directory. ludic-dev release consumes every changeset here into a new CHANGELOG.md section, bumps VERSION, and deletes the consumed files.

Format

bump: minor
type: feat
One or more lines describing the change, in the past-agnostic imperative used in
the changelog. Markdown is fine.
  • bump: — major, minor, or patch (SemVer). The release version is bumped by the highest level among the pending changesets (unless ludic-dev release <level> overrides it).
  • type: — the Conventional Commit type (feat, fix, perf, docs, …). It decides which group the change lands in: feat → Features, fix → Fixes, perf → Performance, and so on, in that order. A type with no known heading gets one named after itself.

Writing the body

The body is markdown and reaches the changelog as markdown: it becomes one list item, with continuation lines indented to stay inside it. Nested bullets, blank lines between paragraphs and inline code all survive.

bump: minor
type: feat
**Tiled map support** — load and draw Tiled maps.

- **TMX/TSX** — the XML formats, decoded to the same intermediate as JSON.
- **Collision** — the `collision` layer projects onto the engine tilemap.

Lead with the thing that changed, not with the mechanism. A reader scanning the release should be able to stop after your first clause.

Adding one

Create a file with a short, unique name, e.g. changes/regex-namespace.md. Any filename works except this README.md, which the release step always skips.

Preview how the next release will read before cutting it — this writes nothing:

ludic-dev release --dry-run