Nocter v0.4.0 Release Record
Purpose
v0.4.0 makes a package graph the unit shared by compiler commands and editor analysis. Package structure, dependency requests, and exact dependency locks live in source-level nocter.nct.
The release scope is Phase 0, Phase 1, Phase 2, and the snapshot/package-graph stabilization audit recorded below. Additional feature work is not part of v0.4.0.
Phase 0 Record
v0.4.0 Phase 0: Source-Native Package Roots and Executable Targets completed on 2026-08-05. It removed implicit main.nct, introduced explicit executable targets, public namespace re-exports, and compiler-owned package/module/executable identities. Its provisional use of index.nct as both metadata and module source was intentionally replaced before v0.4.0 release by the Phase 1 package-file contract.
Phase 1 Record
v0.4.0 Phase 1: Deterministic Package Graph completed on 2026-08-05. It established:
- only a directory containing
nocter.nctis a package root nocter.nctcontains both a separately modeled manifest and ordinary root-module codeindex.ncthas no package responsibility and remains a directory module- an executable requires
name; omittedentryselects the root module innocter.nct, while explicitentry: "."selects the ordinary root directory module inindex.nct - package-root and path modules have distinct typed identities instead of sharing a sentinel path
- the legacy source-root concept and entry-file-parent import fallback are absent
- imports classify module-relative, package-absolute, dependency, and standard-library namespaces without ambient name search
#dependenciessupports path, Git, and archive sources#lockis deterministic generated data innocter.nct- Git builds use exact commits and archive builds use SHA-256 content identity
- aliases are package-scoped and physical stores are keyed by
PackageId - cycles, missing locks, source/lock mismatch, missing caches, path escapes, symlink escapes, and unsafe archive paths are diagnosed
nocter fetch,--locked, and--offlinehave stable behavior- CLI compilation follows transitive dependency namespaces
- LSP discovers nested package ownership, performs no network or manifest writes, and shares locked graph identity for analysis, completion, and navigation
- formatter and JSON AST preserve the manifest/module boundary
The detailed architecture is in Packages, Dependencies, and Locks.
Non-goals
- registries, semantic-version ranges, branches as build identity, or a separate lockfile
- ambient lookup of packages installed in Nocter home
- dependency deduplication by display name or declared version
- multi-package workspace membership declarations
- package-wide incremental invalidation, rename, code actions, or inlay hints
- test targets or a package test runner
Qualification
Phase 1 passed compiler check, all unit and integration tests, formatter verification, warnings-denied Clippy, public documentation generation, native package and dependency tests, optimized local distribution, installed-home doctor, packaged-home check/build/run, generated native executable execution, and archive inspection. The dependency qualification covers path, Git, and archive inputs; exact offline reuse; graph cycles; cache misses; source/lock mismatch; and failure-atomic generated lock updates.
Phase 2 Record
v0.4.0 Phase 2: Immutable Package-wide LSP Snapshot completed on 2026-08-06. It established:
- one immutable, generation-numbered snapshot for every normal LSP feature request
- package graphs loaded once per open package and shared by analysis, navigation, and completion
- compiler analyses rooted at each open document and retained with their actual source dependencies
- incremental invalidation of a changed source and its reverse importers while unrelated analyses retain their immutable allocation
- package-graph revision invalidation when an owning
nocter.nctchanges - read-only open-document overlays for package directives through a locked, offline graph loader
- separate graph snapshots for nested packages
- versioned diagnostics and generation-backed semantic-token result identifiers
- watched disk-file invalidation and consistent diagnostics for independent open documents
- recovery analyses derived from snapshot documents and graphs without replacing shared state
The detailed architecture is in Immutable LSP Snapshots.
Phase 2 Non-goals
- scanning every unopened package module to build an ambient symbol index
- persistent semantic caches, background workers, or concurrent request scheduling
- rename, code actions, inlay hints, or a package-wide refactoring engine
- registries, semantic-version selection, or changes to exact dependency identity
Phase 2 Qualification
Phase 2 passes snapshot generation, reverse-import invalidation, unrelated-analysis reuse, unsaved manifest graph replacement, watched-file invalidation, nested-package isolation, independent diagnostic retention, existing LSP behavior, compiler unit tests, formatter verification, and warnings-denied Clippy. It also passes the full repository suite, optimized local distribution, installed-home doctor, and packaged LSP acceptance for versioned diagnostics and semantic-token generation identifiers.
Stabilization Audit Record
The v0.4.0 snapshot and package-graph stabilization audit completed on 2026-08-06. It closed the following correctness gaps without changing package identity or import semantics:
- frontend loads now return a dependency trace on both success and failure
- unresolved file and directory-module candidates remain invalidation dependencies, so creating a missing import repairs its open reverse importers
- logical, canonical, and nearest-existing-ancestor path aliases cover deletion and symlink events
- package graph loads retain every visited
nocter.ncteven when a transitive manifest fails - invalid manifests discard the current graph instead of exposing a stale successful graph, and a subsequent repair deterministically restores analysis
- LSP clients can dynamically register
**/*.nctwatching, and advertiseddidSavetext enters a new immutable generation - an explicit server lifecycle rejects pre-initialize, repeated-initialize, and post-shutdown requests with protocol errors
- a deterministic 49-document workload proves that a shared-source edit rebuilds its 24 reverse importers while retaining all 24 independent analysis allocations
The audit extends the Phase 2 architecture rather than adding a Phase 3 feature surface. Its focused gates cover missing-file creation, malformed-file repair, symlink deletion, malformed root and transitive manifests, dynamic registration responses, saved text, lifecycle ordering, and large-workspace reuse partitions.
Stabilization Qualification
The stabilization audit passes the complete repository verification script: compiler check, 2,204 library tests, all CLI build/run/package/LSP and distributed-home integration tests, corpus tests, formatter verification, and warnings-denied Clippy. Public documentation regeneration, optimized local packaging, installed-home doctor, archive inspection, and packaged-binary JSON-RPC acceptance also pass. The packaged acceptance covers dynamic file-watcher registration, versioned diagnostics, semantic-token generation identifiers, and post-shutdown rejection.
Release Gate
The v0.4.0 release candidate freezes the completed Phase 0 through Phase 2 feature scope. Release qualification requires the complete repository verification suite, public documentation build, optimized distribution build, installed-home doctor, packaged check/build/run and LSP JSON-RPC acceptance, native executable execution, archive inspection, matching 0.4.0 compiler/home/manifest identity, and a clean Git worktree.
Registry and semantic-version selection remain later work because they add resolver policy rather than strengthen the exact-source graph released here.
Qualification Result
The v0.4.0 release gate completed on 2026-08-06. The exact 0.4.0 candidate passed:
- compiler check and 2,204 library tests
- 296 CLI build, 7 formatter, 15 LSP protocol, 16 package, 449 native run, 199 distributed-home, and 7 example-corpus integration tests
- canonical formatting and warnings-denied Clippy
- generation of all 54 public documentation pages
- optimized
arm64-darwinpackaging and installed-homedoctor - packaged package-mode check, build, run, and generated Mach-O execution
- packaged JSON-RPC acceptance for saved text, dynamic file watching, versioned diagnostics, generation-backed semantic tokens, and post-shutdown request rejection
- archive metadata and single-
.nocter/-root inspection
The compiler, installed VERSION, distribution manifest, and archive name all identify v0.4.0. No release blocker remains in the frozen Phase 0 through Phase 2 scope.