Skip to content

v0.5.0

Choose a tag to compare

@rawframe-release rawframe-release released this 04 Nov 08:00
8ff9e62

0.5.0 (2026-11-04)

Changed

  • Breaking: kest lsp and kest dap read a \u escape that is half of a UTF-16 pair with no other half as U+FFFD (EF BF BD). They wrote the three bytes UTF-8 would use for that number, \ud800 as ED A0 80, which spell no character: an editor holds its buffer as UTF-16 and can send a lone half this way, and the language server then published K0107 ("the byte 0xed starts no character") once for each of the three bytes, while the file the same editor saves, with U+FFFD in the half's place, checks with nothing to say under kest check. A buffer with a lone half now checks, and under kest dap a lone half in a path or an expression reads as U+FFFD. A whole pair, and every other \u escape, is read as before. (#233)
  • Breaking: A set of flags is held to the bits it has names for. ~ on a set flips only those bits, where it flipped every bit of its width, and S(bits) keeps only those bits, where it kept every bit it was given; either made a set that wrote itself as a set it did not equal. With flags S: u8 { A B }, u8(S(u8(255))) and u8(~S()) answer 3 where they answered 255, S(u8(12)) is S() where it held 12, and ~S() == S.A | S.B is true where it was false, in every engine and compiled to C. ~ on a whole number, and a set with a name for every bit of its width, answer as before. A deterministic program observes this, so the profile moves from kest-det 3 to kest-det 4. (#238)
  • Breaking: A program that reads a bool that is not nought or one, or a set of flags with a bit none of its names cover, out of memory a host lent is refused with K0668 where it reads it, as a tag with no case is refused with K0651. It went on with a value that was neither: with flags Mood: u8 { Hungry Tired } and a lent [Sense] of struct Sense { up: bool; mood: Mood }, a host writing 2 into up had if senses[0].up take its branch while senses[0].up == true was false, and writing 255 into mood had u8(senses[0].mood) answer 255, a Mood that wrote itself as Mood.Hungry | Mood.Tired and was not equal to it. Each read now stops with "bool here holds 2, which is neither true nor false" or "Mood here holds 255, which has bits it has no names for". A body compiled to C refuses with the same code and the same sentence. A lend whose bytes are values of their types, and a program reading its own memory, answer as before. (#239)
  • Breaking: kest hostile hands a door that takes a set of flags one of four, chosen by the seed: the empty set, every flag the set names, one flag, or some of them. It wrote the empty set every time, so a door that went wrong on a flag was never handed one: for a door Engine.felt(m: Mood) with flags Mood: u8 { Hungry Tired }, seeds 1 to 8 wrote 64 calls of it, and every one was Engine.felt(Mood()). The same file and seed now write a different program wherever a door takes a set; a file with no such door is written as before, byte for byte. (#243)