Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/development/releases/v0.9.0.md

Nocter v0.9.0 Stabilization and Qualification

Status: Published and audited on 2026-08-08.

This record owns the final engineering audit and release-candidate evidence for v0.9.0. The milestone contract is frozen in ../milestones/v0.9.0.md. Stabilization may correct defects, remove duplicate authority, improve diagnostics, and add regression coverage; it must not introduce another public feature.

The public release index and root download instructions identify v0.9.0. Repository tag v0.9.0 preserves its exact publication commit.

Contract Audit

The audit must establish all of the following from source and tests:

  • std/str and std/slice are the only implementation authorities for built-in view methods
  • public view behavior is selected by resolved declaration or primitive identity, never by a member's display text
  • String and Vec<T> retain only owned-storage, mutation, construction, transfer, or explicit interface responsibilities; they do not forward borrowed observation methods
  • receiver coercion has one selector and one recorded plan shared by type checking, ownership, provenance, analysis, native lowering, and editor features
  • result origins and source loans remain exact through coerced optional, fallible, aggregate, iterator, callback, and generic results
  • built-in implementation loading and duplicate diagnostics are deterministic and independent of filesystem or hash iteration order
  • hover, completion, signature help, definition, references, rename, and semantic tokens use the selected source declaration and normalized source notation
  • no temporary compatibility table, silent fallback, unfinished implementation marker, or user-reachable panic remains in the v0.9.0 surface

Any defect found by this audit requires a focused regression test and a separate implementation commit before candidate identity changes.

The audit found and closed two authority defects before candidate identity changed:

  • built-in owner spelling and implementation-module paths had separate frontend and resolver tables; one BuiltinTypeOwner registry now owns both facts for frontend loading, authority validation, resolver collection, trusted primitive validation, type checking, and analysis
  • std/string and std/vec still exported raw view and borrowed-observation forwarding helpers; those helpers are now private, and callers use the source-owned str and [T] methods through receiver coercion, expected-type coercion, or explicit as

Focused tests prove registry uniqueness and reject external imports of every private owning-view helper. The remaining len spelling check belongs only to typed literal-pack syntax; ordinary member typing and lowering use resolved declarations or trusted primitive roles. Receiver selection records one plan consumed by ownership, provenance, lowering, and selected editor queries. Completion candidate recovery remains a separate TypeExpr boundary because it operates before a complete expression can have a selected call plan; it consumes the same resolved coercion identities and capability rules.

No TODO, FIXME, HACK, XXX, todo!, or unimplemented! marker remains under compiler or standard-library production source. Deterministic collection, malformed built-in declarations, coerced optional and iterator results, ownership conflicts, hover, completion, signature help, definition, references, rename, and semantic token behavior all retain focused coverage.

Repository Qualification

The exact candidate commit must pass both incremental and clean runs of development/compiler/scripts/verify.sh. Each run must include compiler-library, CLI build, formatter, framed LSP, package, native run, native test-command, distributed-home, public-example, source-corpus, documentation, Rust formatting, and warnings-denied Clippy coverage.

Public Markdown must be regenerated with node docs/build-docs.js. Generated page count, git diff --check, and a clean worktree are part of the evidence.

Release-content commit 90b66169c58d30665bdcad38d964ded30c2b579e passed an incremental development/compiler/scripts/verify.sh run and a second run after cargo clean -p nocter. Each run covered:

  • 2,347 compiler-library tests
  • 296 build CLI tests
  • 7 formatter CLI tests
  • 27 framed LSP CLI tests
  • 18 package CLI tests
  • 452 native run tests
  • 11 native-test CLI tests
  • 224 distributed-home tests
  • 2 public-example tests
  • 7 source-corpus tests

The total is 3,391 tests per run. Both runs also passed cargo check, cargo fmt --check, and cargo clippy --all-targets -- -D warnings. Documentation generation produced 106 pages, and git diff --check passed.

Qualification-harness commit 5d7d06a5324ae1ed211e79e650263861f66a10b0 makes its LSP response assertion independent of JSON field order. It changes no compiler, standard-library, packaging, specification, release-note, or archive input from the fully verified release-content commit.

Candidate Identity

The Cargo package and lockfile, installed VERSION, distribution manifest, archive name, CLI version, LSP server version, specification status, English release notes, and candidate record all identify v0.9.0. The root README and releases/README.md identify it as the latest published release.

Cargo package metadata, the lockfile, installed VERSION, distribution manifest, archive name, CLI output, LSP initialization result, specification status, English release notes, and published download pages identify v0.9.0.

Artifact Qualification

The candidate archive must contain exactly one .nocter/ root with the compiler, standard library, version and manifest metadata, license, and notice. Record its exact file name, byte size, SHA-256, candidate commit, and standard-library file count.

Extract the archive into a fresh temporary directory outside the repository. Without inherited NOCTER_HOME, the extracted compiler must pass:

  1. 1. --version, doctor, and top-level help
  2. initialization of a fresh executable package
  3. locked and offline package checking
  4. the initialized package's native test
  5. two byte-identical locked/offline JSON package graphs
  6. locked/offline package run
  7. locked/offline explicit build to a selected output path
  8. direct execution of the generated ARM64 Mach-O executable
  9. a framed LSP initialize, initialized, shutdown, and exit lifecycle reporting v0.9.0

The installed VERSION, MANIFEST.json, LICENSE, and NOTICE must match their tracked inputs. Creating the archive twice from the same candidate commit must produce equivalent extracted content; compressed byte identity is not required because gzip and archive metadata may vary.

development/compiler/scripts/qualify-local-release.sh created the archive twice and compared the two extracted .nocter/ trees recursively. The second archive is the retained local candidate:

  • archive: dist/nocter-v0.9.0-arm64-darwin.tar.gz
  • archive root: .nocter/
  • byte size: 3,375,819
  • SHA-256: c11f7ea65f49a8061156e47af7621b46b2f86329d464a067a5efc036eecb0cf8
  • compiler: ARM64 Mach-O reporting Nocter 0.9.0
  • contents: compiler, v0.9.0 version and manifest metadata, Apache-2.0 license and notice, and all 28 standard-library source files

The extracted metadata and legal files match their tracked inputs byte for byte. Without NOCTER_HOME, the second extraction passed all nine matrix entries above, including one generated native test, byte-identical JSON graphs, direct execution of the selected output, and a framed LSP lifecycle whose initialization result reports server version 0.9.0.

Publication Boundary

The qualified archive is immutable. Any compiler, standard-library, or packaging change requires clean and incremental requalification plus a new size and digest. Publication was separately authorized on 2026-08-08 and used only the archive identified above.

Publication Record

Nocter v0.9.0 was published at github.com/rvo-jp/nocter/releases/tag/v0.9.0 on 2026-08-08. Annotated tag v0.9.0 resolves to publication commit 8811508f1b3b19d30e5f768097c57e73ebe4bde6, which contains the English release notes, current specification, standard library, packaging inputs, and generated website.

GitHub resolves v0.9.0 as the latest release. It is neither a draft nor a prerelease and contains exactly one asset: nocter-v0.9.0-arm64-darwin.tar.gz, 3,375,819 bytes, with digest sha256:c11f7ea65f49a8061156e47af7621b46b2f86329d464a067a5efc036eecb0cf8. This matches the qualified local archive; the asset was not rebuilt or replaced during publication.

Post-Publication Audit

The asset was downloaded from its public release URL into a new temporary directory. Its size and SHA-256 matched the qualification record. The extracted ARM64 Mach-O compiler reported Nocter 0.9.0, found its adjacent .nocter/ home without NOCTER_HOME, and passed doctor and top-level help. Its version, manifest, license, notice, and all 28 standard-library files matched the tracked distribution inputs.

The downloaded compiler initialized a fresh executable package. That package passed locked/offline check, its generated native test, two byte-identical JSON graph runs, package run, explicit build, and direct execution of the generated Mach-O executable. A framed initialize, initialized, shutdown, and exit LSP lifecycle completed successfully and reported server version 0.9.0. Publication is complete and no release repair remains.