Releases: noeta-lang/noeta
Releases · noeta-lang/noeta
Release list
v0.7.1
Features
- ext-abi:
Tojoins the built-in trait names an extension may advertise - lang:
impl To<Target> for Source, the conversion declared on the source
Fixes
- types:
Equatableoverloads no operator - check: a conversion produces its target, and nothing else
Documentation
- errors: link the To section by the anchor the site generates
- ext-abi: give 27 a changelog entry in the shape the gate reads
- errors: a conversion produces its target, and cannot fail
- traits:
Toin the trait table, and the claims it made incomplete - errors: converting into a type you do not own
Refactoring
- check: one conversion registry, keyed by the relation it declares
- types: one row per built-in trait, spelling only what is unusual
Housekeeping
- release: bump workspace version to 0.7.1
- types: census rows carry field names, not nine positions
- types: pin every column of the built-in trait table, and force a new trait into it
- check: keep the conversion helper clear of the allow it displaced
- conversion: the
Tocorpus — both call paths, the conflict, the signature rule
Other
- close
To<Target>and the built-in-trait seam, file the column gate para/dbswallows the cause of a failed connectionTo<Target>, and the built-in-trait seam to settle first
Full changelog: v0.7.0...v0.7.1
v0.7.0
⚠ Breaking changes
- stdlib:
countis cardinality everywhere; the popcount iscount_true
Features
- census: cover the name-dispatched surface, and the two defects it found
- census: a width-door census, and the three defects it found on first run
- check: warn when a
u64's width is discarded into adynposition (E0078) - iter: the eight terminals the eager list had and the lazy pipeline did not
- http: request signing and verification (RFC 9421)
- http: a per-client cookie jar
- http: follow redirects above the seam, and let a client configure it
- stdlib: declare the traits five native types already honor
- traits: a standalone
implmay implement any built-in trait, and a type's owncompareorders it everywhere - collections: one declared ordering behind sorted, min and max
- check:
min/maxorder byComparable, so a generic body can reach them - reflect: describe immutable closure-valued top-level bindings
- stdlib: a vector kernel bundle does geometry at every width
- types: range-checked narrowing conversions —
checked_to_u8(): ?u8 - fmt: the safety gate compares programs, not a rendering of them
- host: a cancellation reaches work blocked outside the interpreter
- cli: the three registry/add/publish doors that existed on one side only
- lang: a field can leave the serialized shape
- lang: a
classdecodes from JSON - lang: name every declared conversion after its source
- lang: one
Fromconversion per source type, resolved statically - lang:
Selfnames the type in hand, in any type body - manifest: a registry scope takes what an identity's company half takes
- manifest:
[package] rootdeclares the segment modules derive under - traits: a
.noetrait declares type parameters, not associated types - modules:
use _self_.ximports this package's own modules - init: cut the scaffolded SYNTAX.md 8.6x and rebalance AGENTS.md
- cli: add
noeta docs— search and read the embedded guide offline
Fixes
- width: compute at the element width, not the erased word, on a boxed list
- bulk: compare
abs/clampat the element width, not the erased word - stdlib: join a
u64under the render hint, on both engines - reductions: fold
checked_sumat the element width, not the erased word - json: a
Map<u64, _>serializes in its key order, not its storage order - iter: a lazy bool reduction gives the eager one's refusal, not a second wording
- runtime: a native type that declares Comparable actually compares
- check: an unknown type says what you meant, and stops rendering as a riddle
- http: a stream carries the client's cookies and its signature
- otel: cap each instrument's attribute-set map at the OTel cardinality limit
- conformance: make the async corpus true on a real host, not only under the sandbox clock
- check: a member binding on a synthesized built-in says to drop it
- registry: resolve every stringly-typed cross-reference at assembly
- check: a refused
@derivenames the routes that would work - conformance: find wasmtime where its installer puts it
- hints: compose a render slot for an instantiation a generic body builds
- playground: the smoke fixture propagates its
?, as its type says - conformance: every oracle sweeps the same corpus, in the same program
- conformance: check every
// expect:header on both engines - hints: resolve a render hint where there is no call frame
- check: pin a generic call's type argument through a literal and a composite
- check: a collection literal argument must not be typed against an erased parameter
- stdlib: one message when a
min/maxcannot order its elements - check: refuse
.as<iN>()/.as<f64>()— a width is not a narrowing target - bundle: pin the ordering-resolution op in the layout digest
- hints: carry a
u64's signedness through a type parameter - conformance: a
--filethat matches nothing is a typo, not a pass - compiler: a hoisted load must not drag its line entry out of the loop
- ext-abi: refuse to assemble a malformed
push_hint_argsdeclaration - display: the REPL echoes a
u64past bit 63 unsigned - cli: the AOT compose tests are jit-shape tests, and now say so
- json: a LiveView binding pushes its
u64unsigned, from the type it was bound under - cli: the Cranelift-free build compiles no AOT composition, and a lint now says so
- rc: destroy an owned argument temporary after the call
- display: render a
@packedmap key'su64field unsigned, at every depth - bench: decide tier-1 coverage on instructions retired, never print an empty decline list
- vm: stop
-xand!xstranding a heap-boxedint - order: order a
u64past bit 63 unsigned at every door a program sees - json: write a
u64past bit 63 unsigned at every JSON door, and read it back - display: render a
u64past bit 63 unsigned at every display door - pm: name the dependency a publish refuses, and the scope member it lives in
- ide: a resolved bare variant pattern is not a local binding
- lexer: four infix operators that could not lead a continued line
- pm: a tree may not declare a built-in scope as its own identity
- lower: a native type named through its module resolves to its identity
- reflect:
fields_ofreports what the call site could have read - cli: a directory walk stops at a nested package
- conformance: link every case, and gate the wiki's toml blocks
- test-temp: make the dead-address tests dead by construction
- ide: gate guide retrieval on a relevance set, and fix what it caught
Performance
- registry: keep the cross-reference sweep off the heap, and re-baseline startup
- re-record the baseline —
<on two ints no longer round-trips through f64 - compiler: hold a top-level binding in the entry frame's registers
- compiler: skip the argument drop for a provably destructor-free temporary
- compiler: release the stale global read at an in-place self-update
- re-baseline —
noeta docscosts ~0.8% of startup, and buys back 300 KB - re-record the instructions-retired baseline on this machine
Documentation
- backlog: close the bulk compare-vs-compute width row
- backlog: close the two rows fixed today but left open
- backlog: close the ignored-compare row — stale on every claim
- backlog: close the unresolved-annotation cascade row
- backlog: file the unresolved-annotation diagnostic cascade
- edge: a redirect target is a host the allowlist has to name
- backlog: close the HTTP client residuals row
- agents: ablate every test, and commit before you do
- traits: retire "derivable" where it meant "has a recipe"
- plans: file the render-hint arc's one open position, refresh the perf frontier
- agents: name the checks that exist only in CI
- backlog: close the body-built composite row
- hints: state what a
u64through a type parameter reads - reflect: point at
construct's real heading - agents: two process-hygiene edges, and what three concurrent gates cost
- agents: name the two linker failures that are really resource exhaustion
- backlog: rank the performance list by measurement, not by hope
- bench: re-measure the cross-language field at 57091de
- backlog: strike the two rows that shipped in the para repos
- backlog: re-point the CRDT row at para/p2p, where every CRDT lives
- plans: every backlog row states what would start it, or is struck
- fix: point the
Selfcross-reference at an anchor that exists - arc: the
Fromgate had not fired the way this audit claimed - backlog: the
Fromrow describes the rule that shipped - codify the docs-style rule in AGENTS.md, and gate its mechanical half
- describe what the language is, not what it was
- cli: say that
noeta serveexpects TLS to be terminated upstream - agents: trim AGENTS.md to the non-derivable half; add CLAUDE.md
Refactoring
- check: name the render-slot feed map and fold its owner into the edge
- vm: land the render-hint runtime state in its own module
- ext-abi: one ABI bump for the render-hint seam, not three
- ext-abi: a kept render hint is a
PushHint, and can only serialize - ext-abi: move the render hint beside the encoder, MapKey and value tree it describes
- compiler: one worker reserves a type's method prototypes
CI & build
- docs: run the docs style gate in CI, not only at the merge gate
Housekeeping
- async: rendezvous with the isolate instead of gating it on a timer
- release: bump workspace version to 0.7.0
- upgrade: wait out the ETXTBSY window before exec'ing the copied binary
- docs-gate: collapse the toolchain-pin condition into one
if - docs: gate that a copied dependency snippet names this release
- drop two scratch probe files swept in by
git add -A - check: assert what E0078 must NOT say, and put its variant on the tail
- docs: report the margin of every top-1 retrieval decision
- check: pin the help that names
count_true - http: drive both of the async descriptor's bodies, not only the fallback
- otel: pin what the overflow bucket preserves, per instrument kind
- conformance: make the unordered-Duration case actually discriminating
- traits: pin that a
via:derive's order reaches every observed door too - conformance: drive the identity-order case through the composed channel
- fuzz: drop the reduction-element reason the census can no longer see
- reflect: pin parameter attributes on a described value binding
- gitignore: ignore gate run logs
- drop a gate run log swept in by
git add -A - oracle: catch a destructor that never ran
Other
- audit the gates, and correct th...
v0.6.0
Features
- diagnostics: colour the abort traceback with its diagnostic
- serve: colour the worker run tail
- diagnostics: colour the two remaining terminal sinks
- diagnostics: colour diagnostics when they are going to a terminal
- abi: declared commands can offer short flag aliases (ABI 17)
- cli: std's dev-tier verbs become replaceable commands (ABI 16)
- repl: interactive prompt on a TTY — highlighting, completion, history
- cli:
noeta watch-scopebecomesnoeta advisory watch, defaulting to the lockfile - ide: byte-offset form of the snippet highlighter
Fixes
- check: a label binds on a method call, not just on a function call
- repl: meta-command completion on an indented line
Documentation
- manifest: point
noeta migrateat the section that still exists - cli: the serve entry is any callable
fetch, not only afn - the REPL's interactive terminal behaviour
- cli: group the command list by where each verb comes from
Refactoring
- runner: one way to print a compile failure and get its exit code
Housekeeping
- release: bump workspace version to 0.6.0
- repl: drive the interactive prompt on a real pty
Full changelog: v0.5.1...v0.6.0
v0.5.1
Fixes
- check: a @test is white-box over its own package, not its dependencies'
Housekeeping
- release: bump workspace version to 0.5.1
Full changelog: v0.5.0...v0.5.1
v0.5.0
Features
- lang: a struct's fields are already public, so
pubon one is refused - check: a declared
staticis type-only, anddynis the dispatch - tooling:
pubon a method reaches fmt, the editors, and the docs - lang: a method is private by default, in every type kind
- doc: an extension's
@-directives are documented - doc: a
.noetype's methods and impls reach its documentation - doc: the API reference documents a unit's traits, enums and types
- abi: a native trait, enum and fielded type can carry its own prose
- tooling:
staticreaches the editors, and one word names "takes no receiver" - lang: a trait may declare a method
static, and receiver-ness stops being a survey - ide: a derived receiver is a fact the source never spells, so show it
- p2p: a host can name an exact data dir for the para.p2p node
- check: a bounded type parameter may sit in receiver position
Fixes
- diagnostics: append-only is the rule, so there is no break to version
- bundle: a diagnostic code inserted mid-catalogue is a wire break
- diagnostics: a new code is appended, so no
.noebis mis-decodable - ext-abi: every intra-doc link resolves, and a gate step keeps it that way
- mcp: a native trait is a trait, constrained or not
- ide: the ghost modifier follows
pub, which is outermost - derive: a synthesized method is a trait implementation, so it is public
- abi: a native trait's namespace is held to its unit's root
- ide: a ghost modifier anchors on
fn, not on the attribute above it - check:
Selfis the receiver's type, through a bound and throughdyn
Documentation
- abi: the authoring walkthrough teaches the published dependency
- vm:
Unsupportedis a coverage regression, not a subset boundary - vm: a compile failure is a coverage regression, not an unsupported fixture
- two
M1.0claims that stopped being true - abi: the receiver constraint row names its third case
Housekeeping
- fixtures: a fixture that lies about its return type proves nothing
- vm: an unannotated parameter was pinning a destructor check no real program needs
- eval: a fixture without a signature is not a program the checker would accept
- visibility: the VM and eval fixtures say
pubwhere the rule now asks - visibility: the embedded programs say
pubwhere the rule now asks - visibility: a refusal fixture shows the refusal it is about
- expand: a generated method is called from outside, so it says
pub - parser: the demo snapshot follows the demo
- embed: a native trait's implementor says
publike any other - fuzz: the census follows the rename, it does not gain a rejection
- ide: rustfmt the modifier-order test
- check: the crate's own inline sources say
pubwhere the rule now asks - visibility: the rule is pinned at every spelling it could leak through
- ide: pin the ghost modifier against
asyncand a@tierdirective - ir: rustfmt the A2 lowering rewrite
Other
- crates-io: publish the contract crates, and patch them like a git pin
- one table for every
@name, and a binding is what enables it
Full changelog: v0.4.5...v0.5.0
v0.4.5
Fixes
- aot:
benchis the same switch astest, and it was still on - test-temp: a drawn port is claimed until its server binds, not until the probe closes
- check: a package whose only files are migrations is checked, not "unreadable"
- check: the checker's program is the loader's program
- check: resolve
--targetagainst the directory it is given
Documentation
- pipe: say that a sole-argument pipe needs no parentheses
Refactoring
- project: the id layout has no callers outside its own file
- project: the boundary is the point — drop the re-export, narrow the surface
- project: extract noeta-project —
noeta checkstops depending on the editor crate
Housekeeping
- release: bump workspace version to 0.4.5
- capture: a stdio-protocol child's stderr is a file, not a pipe nobody reads
- socket: a failing suite quotes what the server said, instead of discarding it
- async: a race asserting an order needs a margin a loaded machine can honour
- fuzz: retire the project oracle's one excused divergence
- cli: the two divergences, pinned at the command line
- fuzz: a check-vs-run differential over generated projects
- agreement: pin the two check/run divergences the census found
Full changelog: v0.4.4...v0.4.5
v0.4.4
Features
- add: resolve the registry's current version when no source is given
Documentation
- packages: one onboarding page, not two that drift apart
- release: a green dispatch is not a green deploy
Housekeeping
- release: bump workspace version to 0.4.4
- readiness: one wait for a spawned server, on a load-scaled budget
Full changelog: v0.4.3...v0.4.4
v0.4.3
Fixes
- check: an illegal module path is a derivation, so check reports it
- expand: DirectiveCtx::source_dir is a path, not a document URI
- check: a migrations/seeds program is not a module, for every surface
- check: a binding in scope wins over a module handle
Documentation
- reflection: the two self-links point at the whole heading again
CI & build
- docs-site: build noeta so the diagnostics reference exists
- the docs site's own link gate runs before a tag, not after
Housekeeping
- release: bump workspace version to 0.4.3
Full changelog: v0.4.2...v0.4.3
v0.4.2
Features
- fuzz: the AOT differential over generated programs
- fuzz: a type-directed generator, and the false-positive oracle it unlocks
- fuzz: the tier-1 JIT differential over generated programs
- fuzz: a leak/RC oracle over generated programs
- fuzz: the runtime-rejection census, and a gate so it cannot grow in silence
- fuzz: an execution oracle — what the checker promises vs what running does
Fixes
- loader: α-rename every binder a merged module holds
- loader: a merged module's bindings carry its identity
- loader: merged module statements run in their own module's order
- fmt: a
?on a?keeps its parentheses, and the precedence table gets a matrix - check: an enum variant takes the fields it declares
- check: a scalar
matchwith no catch-all is provably non-exhaustive - check:
asserttakes a bool and at most a message - check: a container is indexed by its key type, and
forneeds something iterable - check: a non-callable value is not callable, and a module has the functions it has
- check: a condition must be a bool, and a literal pattern must be able to match
- check:
&&and||take bools - check:
noneis anOption, not a value of whatever type is expected - check: an ordering needs one type; a function value and a tuple are closed
- check: two declarations of one name in one file collide (E0020)
- check: a
for (a, b)pattern needs a tuple element with a position per name - check: a declared type is not callable
- check: the hoisted-globals fallback licenses a deferred reference, not an early one
- bundle: cap the inflate so a payload cannot expand without bound
- fmt: comments inside
${…}holes survive, and stay in their branch - fmt: a trailing comment belongs to its region, not just its line
- fmt: a spread list is not the same as one concatenated with something
- fmt: the placement oracle counts only statement
else if - fmt: two comment relocations, both from an unwalked region
- fmt: the placement oracle measures AST blocks, not braces
- fmt: a resugared conditional is not brace-delimited either
- fmt: an arrow closure is not self-delimiting
Documentation
- contributing: the census, the leak oracle, and the tier-1 differential
- fuzz: name the real check-vs-run surfaces instead of a placeholder link
- contributing: structured fuzzing joins the testing architecture
Refactoring
- fmt: the formatter's invariants become a shared oracle
CI & build
- release: a release tells the para repos to bump their toolchain pin
Housekeeping
- release: bump workspace version to 0.4.2
- loader: two dependency packages may each bind the same name
- fuzz: ungrouped hex digits in the jit seed
- rustfmt the new checker gates and the run oracle
- fuzz: the
.noebcontainer, and what the compiler assumes - fuzz: the formatter's oracle runs over generated programs in the gate
- fuzz: a structured generator of valid Noeta programs
Full changelog: v0.4.1...v0.4.2
v0.4.1
Features
- perf: gate on instructions retired, because wall-clock cannot gate here
Fixes
- editors: re-record the vscode test-workspace lock hash it had drifted from
- perf: the tier-1 state probe must count OSR windows, or it reports native code as none
- loader: say why the retry's path derivation cannot report anything
- ext-abi: re-point the constraint-coverage anchors the lazy seams moved
- perf: the declined-op list never reached the report
- perf: name the fix that matches the cause when perf cannot count
- loader: the walk-coverage gate has an opinion about the reflection node
- host: a retry backoff has to reach the door that actually waits
Performance
- gate: re-baseline after the list_len inline
- value: list_len is inline(always) -- it is Op::Index's bounds check
- tools: attribute a binary's load-time relocations to the crate that owns them
- gate: re-baseline after region-scoped OSR compilation
- db: the workspace package map is built once, not once per source
- parser: one
${…}hole grammar per parse, not one per hole - jit: a prototype collects one OSR window per hot loop, not one per prototype
- gate: re-baseline after the MCP corpus blob
- mcp: the embedded corpus costs two relocations, not one per file
- jit: a back-edge promotion compiles the loop's window, not the whole prototype
- gate: re-baseline after the per-parse grammar build
- gate: re-baseline after the clap fast path
- parser: the grammar is built once per parse, not once per site
- cli: the clap command tree is built once, and a flagless run never builds it
- gate: re-baseline after outlining the cold opcode arms
- vm: outline
Op::CallMethod's four receiver-dispatching routes - vm: outline the cold opcode arms so the hot ones allocate registers better
- gate: re-baseline after the lazy native-reflection seam
- gate: re-baseline after the tier-1 and heap work, and move the map row's band with its engine
- loader: a script no longer parses the neighbours it cannot name
- value: the map hasher mixes a word per round, not a byte
- check: a native type's built-in traits answer from the registry, on the question
- reflection: a native declaration resolves on demand, not into every artifact
- jit: the string/map loops sustain tier 1
- heap: a leaf is never registered with the cycle collector
- vm: set_reg inlines again — the dispatch loop outgrew LLVM's budget
Documentation
- release: push the branch, wait for green, then tag
- db: why workspace_editions is not memoized, and what would change that
- jit: the forced sweep offers every loop header, not just the first
- architecture: name the native-reflection seam in the crate map
- ast,loader: the lazy native-reflection seam and the sibling-parse deferral
- RELEASE.md — what the tag automates, and what it does not
Refactoring
- reflect: tidy the collapsed dispatches, and record where it stopped
- reflect: thirteen intrinsics become one node with a fieldless kind
Housekeeping
- release: bump workspace version to 0.4.1
- jit: a runtime ablation mask, so a regression can be attributed without a build per variant
- perf: remove the temporary phase probes
- vm: the two tier-1 fixtures that Stringify/LoadConst made stale
- cli: the declined-loop fixture uses a list method, not a map loop
- perf: drop a no-op type assertion left in the executable-bit test
- perf: rustfmt the ratchet manifest test; complete the exit-2 list
- os: the sandbox's model of try_write, held to the real host
- reflect: the census that closes the class
Full changelog: v0.4.0...v0.4.1