What's Changed
- docs(#152): point LANGUAGE.md to the canonical
machin guidecatalog by @javimosch in #317 - fix(#153): sync README/SPEC command lists with
machin helpby @javimosch in #318 - fix(#154): add missing FFI/arena/counter/game_menu rows to examples/README.md by @javimosch in #319
- fix(#155): add docs/LANGUAGE.md and machin guide catalog to feature checklist by @javimosch in #320
- fix(#157): document the CC env var that overrides the C compiler by @javimosch in #322
- fix(#158): add missing gui/ section to examples/README.md by @javimosch in #323
- fix(#159): add extern/FFI keywords to machin guide catalog by @javimosch in #324
- fix(#161): describe MFL source as plain canonical text in changelog pages, not base64 by @javimosch in #325
- fix(#162): add landing page, changelog, and selfhost version to release checklist by @javimosch in #326
- fix(#163): add regex example and document silent-failure/literal-repl semantics by @javimosch in #327
- fix(#176): add runnable example for time_make/time_format/time_fields by @javimosch in #329
- fix(#95): document input() builtin in LANGUAGE.md Builtins table by @javimosch in #330
- fix(#99): drop stale "decoded form" wording from SPEC.md §14 title by @javimosch in #332
- fix(#104): clarify README's canonical-form snippet isn't a demo.mfl transcript by @javimosch in #333
- fix(#105): link tokmin.py and reliability harness from README/AGENTS by @javimosch in #334
- docs(#86): add CONTRIBUTING.md authoring guide, link from README by @javimosch in #336
- fix(#89): document logical operators (&&, ||, !) in LANGUAGE.md by @javimosch in #337
- fix(#305): FFI callbacks — pass a captureless MFL closure as a C fn pointer by @javimosch in #339
- fix(#156): document json_get in LANGUAGE.md and add a runnable example by @javimosch in #321
- fix(#171): document read_stdin() in LANGUAGE.md and add a runnable example by @javimosch in #328
- fix(#98): describe .mfl as canonical plain text in examples/README.md by @javimosch in #331
- fix(#70): document closures as capturing by reference, not by value by @javimosch in #340
- fix(#71): document scoped arenas and --safe in LANGUAGE.md by @javimosch in #341
- fix(#72): add missing grep/time/stdin_upper rows to examples/README.md by @javimosch in #342
- fix(#150): document break/continue and bare for{} loop in LANGUAGE.md by @javimosch in #343
- fix(#74): add arena production to SPEC.md grammar by @javimosch in #344
- fix(#75): update selfhost server info to v0.4.1 and current features by @javimosch in #345
- fix(#76): document nil as reserved but not implemented by @javimosch in #346
- fix(#77): correct docs claiming run.sh runs every example by @javimosch in #347
- fix(#78): add map, chan, func, and struct rows to LANGUAGE.md Types table by @javimosch in #348
- fix(#79): document var declaration form in LANGUAGE.md by @javimosch in #349
- fix(#80): bump landing page version badge and cover v0.4.0+ features by @javimosch in #350
- fix(#81): document the machin encode authoring workflow by @javimosch in #351
- fix(#83): add v0.4.0 and v0.4.1 entries to June 2026 changelog pages by @javimosch in #352
- fix(#84): document manual release binary download in README Install section by @javimosch in #353
- docs(#148): add file I/O, process, time, and WebSocket/TLS rows to LANGUAGE.md Builtins table by @javimosch in #354
- refactor(skillcmd): build embedded skills map once instead of per-call by @javimosch in #356
- docs(#148): document raw memory, TTY, dial/socket, and noise builtins by @javimosch in #357
- chore: gofmt cleanup for godoc comment style and struct alignment by @javimosch in #358
- chore(tighten_test): fix comment alignment via gofmt by @javimosch in #359
- test(convert): cover f64_bits/f64_from_bits sign bit and zero round trip by @javimosch in #360
- test: cover sin/pi/charat/bytes_index builtins by @javimosch in #361
- test: cover asin/cbrt/exp/log/fmod/to_lower builtins by @javimosch in #362
- fix: compile with -fno-strict-aliasing to stop silent peek/poke miscompiles by @javimosch in #363
- test(bytes_io): cover write_file_bytes/read_file_bytes NUL round-trip by @javimosch in #364
- test(netio): cover https_post/tls_read_bytes/tls_write_bytes/wss_send/wss_close codegen gating by @javimosch in #365
- test: cover substr/charat out-of-range and negative index clamping by @javimosch in #366
- test: cover index/has_prefix/has_suffix boundary cases by @javimosch in #367
- test: cover classifyParse/classifyCheck message-routing branches by @javimosch in #368
- test(racecheck): cover clonePath/pathEq/mapValType/copyIntMap helpers by @javimosch in #369
- test: cover byte_at/bytes_sub/bytes_index bounds clamping by @javimosch in #370
- test(transform): cover localNames/collectDeclared/freeIdents closure-lift helpers by @javimosch in #371
- test(build): cover gunzip round-trip and ccPath/zigPath env overrides by @javimosch in #372
- test(types): cover splitMapType and reconcile helpers by @javimosch in #373
- test(racecheck): cover placeOf and mergeGAcc helpers by @javimosch in #374
- test(main): cover raceGate clean/type-error/race-found paths by @javimosch in #375
- fix(codegen): give closure envs and captured-var boxes independent lifetimes by @javimosch in #376
- test(racecheck): cover typeShared heap-sharing cases by @javimosch in #377
- test(types): cover IsGlobal/GlobalKind/ParamKind/RetKindAt/ClosureInst by @javimosch in #378
- test(guide): cover renderGuideText and cmdGuide --skill/--text/--json by @javimosch in #379
- test(racecheck): cover collectLocals shadowing across all Stmt kinds by @javimosch in #380
- test(transform): cover liftClosures capture-by-reference lifting by @javimosch in #382
- test(main): cover cmdPack arg validation, encoding, and repack tolerance by @javimosch in #383
- test(parser): cover parseTypeName/parseTypeDecl/parseMake branches by @javimosch in #384
- test(parsetest): cover sexprExpr/sexprStmt/sexprFunc/sexprGlobal/sexprExtern by @javimosch in #385
- test(types): cover tryRange channel range arity check by @javimosch in #386
- test(uftest): cover cmdUFTest script ops, dumpUF, and boolToInt by @javimosch in #387
- test(main): cover cmdEncode missing-arg and composeSources file-error paths by @javimosch in #388
- test(framework): cover cmdFramework list/print/vendor command paths by @javimosch in #390
- test(main): cover cmdRun and cmdBuild error paths by @javimosch in #391
- test(testcmd): cover cmdTest no-files and JSON output paths by @javimosch in #392
- test(cmdrun): cover --safe flag code path by @javimosch in #394
- test(lexer): cover isDigit/isAlpha/isAlnum character class helpers by @javimosch in #395
- test(codegen): cover cZero for all Kind values including KChan/KMap/KVar/KNum/KVoid by @javimosch in #396
- test(parser): cover isExternDirective keyword checking by @javimosch in #397
- test(codegen): cover stringZeroInits for nested struct string field initialization by @javimosch in #398
- test(testcmd): cover cmdTest JSON output with failing tests by @javimosch in #399
- test(closures): cover simple closure value capture by @javimosch in #400
- test(classify): cover classifyCheck empty-message fallthrough case by @javimosch in #402
- test(exec): cover exec() zero exit code case by @javimosch in #404
- test(types): cover tryRange for slice/string/map iteration by @javimosch in #405
- test(crypto): cover sha1_bytes empty input edge case by @javimosch in #407
- test(build): cover ccPath/zigPath empty env var fallback cases by @javimosch in #410
- test(cli): cover parse_int empty string edge case by @javimosch in #411
- test(convert): cover parse_float negative value parsing by @javimosch in #412
- test(callbacktype): cover single param with return type case by @javimosch in #413
- test(system): cover nonexistent command error case by @javimosch in #414
- test(url_decode): cover reserved character decoding (&, =, ?) by @javimosch in #415
- test(loaddecls): cover empty, whitespace-only, and multiple declaration cases by @javimosch in #416
- test(cmdencode): cover composeSources empty array edge case by @javimosch in #408
- test(mathstr): cover abs() and round() edge cases including negative values by @javimosch in #406
- test(declfromline): cover empty string edge case by @javimosch in #409
- test(checktest): cover cmdCheckTest empty program case by @javimosch in #393
- test(lextest): cover cmdLexTest/cmdLexBench error paths by @javimosch in #389
- test(guide): cover isBuiltinName catalog lookup and memoization by @javimosch in #381
- test(transform): cover liftClosures with multiple captures and nested if statements by @javimosch in #401
- test(parser): cover parseWhile invalid condition and unterminated body by @javimosch in #417
- test(closures): cover multiple variable capture in closures by @javimosch in #403
- test(uftest): cover func-no-params form and post-failure op skipping by @javimosch in #418
- test(main): cover usage() output for subcommand listing by @javimosch in #419
- test(transform): cover freeIdents Unary/CallValue/SliceLit/FieldAccess/Range/GoStmt/ArenaStmt branches by @javimosch in #420
- test(types): cover tryRange union-mismatch error branches by @javimosch in #422
- fix: complete #314 — closure-captured data now survives the go arena boundary by @javimosch in #421
- release: v0.107.0 — complete the #314 closure-capture arena fix by @javimosch in #423
Full Changelog: v0.106.0...v0.107.0