Nocter v0.7.0 Milestone
Status: Phase 0 completed on 2026-08-07. Phase 1 completed and qualified on 2026-08-08. The qualified archive was published and audited on 2026-08-08.
Purpose
v0.7.0 separates implementation allocation from the storage-lifetime relationships an API user must manage. Public from clauses continue to name receiver, parameter, allocator, and static origins supplied by the caller. Newly allocated result storage and execution-time allocation are compiler-owned facts and do not appear in ordinary callable syntax.
The released baseline is v0.6.0. That release proved lossless result-allocation dataflow across aggregates, outcomes, recursion, closures, generics, interfaces, iterators, and ownership transfer. v0.7.0 keeps that semantic foundation while removing the alloc result modifier and its callable variance from the source language. It does not reinterpret alloc as an execution effect.
Phase 0: Compiler-Owned Result Storage
Phase 0 completes the source and semantic migration. The accepted callable surface becomes:
func copy(): String
func view(text: &String): &str from text
func copy_with(allocator: &+Allocator, text: &str): String from allocator
Public Contract
from Xmeans that a returned storage-bearing projection may retain an origin supplied by the resolved receiver, parameter, allocator capability, orstaticoriginX.- absence of
frommeans that the result has no caller-managed external origin. It does not promise allocation-free execution or storage independence from the active lexical region. - implementation allocation, temporary allocation, and fresh storage retained by a result do not add source modifiers or editor-only signature prose.
allocremains an ordinary identifier, includingstd/mem.alloc; it is not a callable modifier or structural callable-type prefix.- the removed modifier has no compatibility AST or formatter mode. A focused parser diagnostic may identify obsolete syntax, but accepted source has only the current model.
Compiler Boundaries
typecheck/provenance/result_allocationcontinues to own lossless fresh-result projections.- body-backed callable summaries start at semantic bottom and infer fresh-result storage from bodies, calls, retained mutations, and trusted operations without consulting declaration text.
- trusted bodyless allocation operations are seeded exclusively by compiler-owned semantic roles.
- bodyless interface members and structural callable values use an internal conservative fresh-result capability when their storage-capable result cannot be proven independent.
- generic, interface, closure, collection-iteration, and ownership-transfer substitution preserve internal allocation provenance independently of declared external origins.
- public
fromvalidation rejects undeclared caller-managed origins but neither requires nor rejects internal fresh-result allocation. - region escape checking instantiates fresh result storage in the call site's active allocation context. No later phase reconstructs this fact from a type or standard-library name.
- resolver signatures, AST JSON, normalized notation, formatter output, semantic tokens, hover, completion, signature help, and code actions contain no result-allocation modifier.
Implementation Order
- 1. Remove
ResultAllocationModifierfrom callable AST shapes, parser construction, AST JSON, formatter notation, resolver signatures, presentation anchors, semantic tokens, and source edits. Preserveallocas an ordinary identifier and add exact removed-syntax coverage. - Remove public
result_may_allocatevariance from semantic callable types. Represent unknown bodyless callable results conservatively inside provenance summaries rather than source types. - Delete E0462, E0463, and E0464 contract validation. Keep deterministic allocation evidence only where an internal region or ownership diagnostic can consume it.
- Seed trusted allocation primitives from semantic roles and retain body-inferred allocation through calls, recursion, aggregates, outcomes, closures, generics, interfaces, iterators, mutation, and ownership transfer.
- Remove modifier spelling from the standard library, examples, fixtures, and current
specification. Keep function names such as
allocunchanged. - Verify source/LSP canonical parity, region escape behavior for ambient and explicit allocators, all distributed standard-library modules, and the complete repository suite.
Completion Gate
- no accepted declaration or callable type contains a result-allocation modifier
- AST and resolver models have no source
ResultAllocationModifieror publicresult_may_allocatefield - obsolete modifier syntax is rejected with one stable source-backed diagnostic while an ordinary
allocdeclaration or call remains valid - fresh-result storage remains exact for body-backed callables and trusted allocation operations
- unknown bodyless callable results are conservative without a spelling- or type-name allowlist
fromvalidation, region escape, retained mutation, closure, generic, interface, iterator, and ownership-transfer matrices pass without sourcealloc- hover, completion, signature help, construction surfaces, inlay hints, and semantic tokens show only accepted source contracts
- the distributed standard library contains no result modifier and its automated callable audit checks semantic behavior rather than declaration spelling
- current public specification and examples describe allocation as implementation dataflow and
external
fromorigins as the only result-lifetime syntax - documentation generation, diff checking, formatting, warnings-denied Clippy, all focused tests, and the complete clean and incremental repository verification suite pass
Non-goals
Phase 0 does not add noalloc, realtime, async, named lifetime parameters, runtime interface dispatch, separate compilation metadata, or new from origins. It does not weaken explicit allocator provenance or lexical-region escape checking. Execution-allocation guarantees require a later phase built on the compiler-owned facts preserved here.
Phase 1: Stabilization and Release Qualification
Phase 1 makes the Phase 0 contract independently releasable. It adds no source syntax. Its work is to close public-boundary gaps, freeze editor behavior, migrate release identity to v0.7.0, and qualify one exact archive without publishing it.
Contract Audit
- every externally callable body uses the same missing-
fromvalidation, including public functions, inherent methods, construction functions, literals, interface defaults, and conformance members - an implementation cannot retain receiver or parameter storage when its interface member promises
no caller-managed external origin;
staticremains a safe narrowing - body-backed inference remains exact and independent of declaration text, while bodyless summaries remain conservative only for fresh internal result storage
- callable compatibility, generic specialization, outcomes, retained mutation, callbacks, and iteration preserve external origins without using parameter count or standard-library names
- focused tests fix both positive narrowing and every public-boundary rejection before release
Tooling and Standard Library Audit
- hover, completion, signature help, construction surfaces, semantic tokens, diagnostics, and
source edits render only accepted
fromclauses from the shared presentation model - origin tokens retain exact source ranges and declaration identities across imports, interfaces, generics, and packaged-home analysis
- every distributed public callable participates in the semantic contract audit; the audit does not infer behavior from spelling
String,Vec<T>, iterators, I/O, process values, typed literals, and explicit allocator paths pass source and installed-home behavior matrices
Release Work
- 1. Record the Phase 1 boundary and add failing tests for uncovered public callable forms and interface narrowing.
- Centralize externally callable body validation and correct interface provenance substitution.
- Complete LSP and distributed standard-library contract coverage without adding editor-only signature prose.
- Update compiler, packaging, specification status, release notes, and generated website content to the v0.7.0 candidate identity. Keep the root README and release index on the latest published release until publication is explicitly authorized.
- Write an English migration-focused public release note and a developer qualification record.
- Run clean and incremental repository verification, produce the optimized archive, and smoke-test
a fresh extracted home through
doctor, package initialization, locked/offline checking, native tests, graph, run, explicit build, direct execution, and LSP startup. - Record the archive byte size and SHA-256 digest, commit the qualified source tree, and stop before tagging, pushing, or publishing.
Completion Gate
- no callable form can expose an undeclared caller-managed result origin
- interface implementations narrow no-origin and explicit-origin contracts soundly
- focused typecheck, interface, analysis, framed LSP, distributed-home, public-example, and source corpus tests cover the stabilized contract
- v0.6.0-to-v0.7.0 migration is documented as removal of result
allocwhile validfromclauses remain unchanged - candidate-owned version metadata and specification status identify v0.7.0, while the root README and release index still identify the latest published release and historical records remain immutable
- documentation generation, diff checking, formatting, warnings-denied Clippy, and clean and incremental complete repository verification pass
- one optimized
arm64-darwinarchive has a recorded size and SHA-256 digest and passes the complete fresh-install smoke matrix - the working tree is clean and publication is the only remaining release action
Non-goals
Phase 1 does not add noalloc, realtime, async, named lifetime parameters, new from origins, runtime interface dispatch, a compatibility AST, or a new target. Publication remains a separate user-authorized action.
v0.7.0 Completion Definition
v0.7.0 is complete when Phase 0 and Phase 1 have passed their recorded gates and the exact archive candidate has passed fresh-install qualification. Completion does not publish the release.
Phase 0 Completion Record
Phase 0 is complete. The compiler and distributed source use the compiler-owned result-storage model end to end:
- accepted callable declarations and structural callable types have no result-allocation modifier
allocis an ordinary identifier, while obsolete modifier positions produce one focused parser diagnostic without entering the AST- public callable bodies must declare every caller-managed external result origin with
from; private bodies retain exact inferred origins without acquiring a public contract - bodyless and structural callables without
fromuse type-directed conservative internal result storage instead of guessing an external origin from parameter count - body inference preserves fresh storage and exact external origins independently through outcomes, generics, interface dispatch, callbacks, iteration, mutation, and ownership transfer
- the standard library declares only external
fromrelationships; editor surfaces render the same accepted source signatures and do not invent allocation annotations - the current specification and compiler-development documentation describe the same ownership boundary
Verification evidence from 2026-08-07:
node docs/build-docs.jsgenerated 116 pagesgit diff --checkpassed- a clean
./scripts/verify.shpassed aftercargo clean -p nocter - an immediate incremental
./scripts/verify.shalso passed - each verification run passed 3,274 tests: 2,252 library, 296 build CLI, 7 formatter CLI, 24 LSP CLI, 18 package CLI, 449 run CLI, 11 native-test CLI, 208 distributed-home, 2 public-example, and 7 source-corpus tests
- both runs passed
cargo check,cargo fmt --check, andcargo clippy --all-targets -- -D warnings
Phase 1 Completion Record
Phase 1 is complete. Externally callable body validation now uses one contract path for public functions, inherent methods, construction functions, literals, interface defaults, and interface conformance members. Interface substitution accepts fresh or static narrowing but rejects an implementation origin absent from the interface contract. Typed sequence literal packs have stable declaration identity and can be named by from items; fixed and spread elements instantiate that origin without turning the ephemeral pack into a runtime value.
The distributed standard library passes the callable contract audit. Vec<T> construction, copying, iterator conversion, removal, and pop operations declare the external origins they retain. Hover, completion, signature help, semantic tokens, diagnostics, and source edits present the same accepted source contracts. Package compile-command help now lists its implemented --locked and --offline reproducibility options.
Qualification evidence from 2026-08-08:
node docs/build-docs.jsgenerated 118 pagesgit diff --checkandcargo fmt --checkpassed- a clean
./scripts/verify.shpassed aftercargo clean -p nocter - an immediate incremental
./scripts/verify.shalso passed - each verification run passed 3,284 tests: 2,262 library, 296 build CLI, 7 formatter CLI, 24 framed LSP CLI, 18 package CLI, 449 run CLI, 11 native-test CLI, 208 distributed-home, 2 public-example, and 7 source-corpus tests
- both runs passed
cargo checkandcargo clippy --all-targets -- -D warnings - the optimized
arm64-darwinarchive is exactly 3,285,691 bytes with SHA-256080160481adbcb0b7f64ab87903b05814aad13fc16207dcc9602e655675f2d78 - a fresh extraction without
NOCTER_HOMEpassed version and manifest identity,doctor,help, package initialization, locked/offline check and one native test, deterministic JSON graph generation, run, explicit build, direct Mach-O execution, and a framed LSP initialize/shutdown/exit lifecycle - the archive contains an executable ARM64 Mach-O compiler, version and manifest metadata, license notices, and all 23 standard-library source files
The detailed immutable evidence is preserved in development/releases/v0.7.0.md. Publication was separately authorized after qualification completed, and the public asset passed the recorded post-publication audit.