Programming Language

Nocter

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

/development/milestones/v0.33.0.md

v0.33.0: Structural Tuples

Status: complete, published, and externally audited (2026-09-04). v0.33.0 adds one coherent structural-product feature across syntax, type identity, ownership, execution, ABI layout, formatting, and semantic tooling. It does not model tuples as nominal structs or ship a parser-only subset.

The normative language contract is spec/33-tuples.md. The cross-crate representation boundary is development/docs/tuple-design.md.

Completion Boundary

  • tuple types and values have one canonical syntax with arity of at least two;
  • ordered element types define one interned structural identity;
  • tuple construction, expected-type inference, numeric projection, and local destructuring work;
  • copy, move, partial move, borrowing, provenance, and destruction compose element by element;
  • MIR and runtime contracts preserve positional shape without synthetic declarations or fields;
  • machine layout is frozen once and consumed by aggregate lowering and the calling convention;
  • formatter and every semantic editor feature use the shared syntax and semantic authorities;
  • practical standard-library APIs demonstrate tuple use without replacing meaningful named records;
  • complete workspace, native, installed-home, example, formatter, LSP, documentation, and repository qualification passes;
  • final review finds no duplicate tuple identity, ownership, layout, or presentation authority.

Phase 0: Contract and Representation Boundary

Status: complete. The public contract fixes syntax, arity, identity, evaluation order, numeric projection, local destructuring, ownership, provenance, layout, tooling behavior, and non-goals. The architecture audit rejects synthetic nominal and PackEntry encodings and assigns one owner to each fact from syntax through machine lowering. The Phase 0 review records feasibility and the implementation hazards closed before source changes.

Phase 1: Semantic Product

Status: complete. Tuple type, expression, projection, and recursive local-binding syntax now intern ordered tuple types in the semantic store. Checking owns construction, expected-type inference, positional places, recursive binding patterns, ownership, loans, provenance, and stable diagnostics. Canonical presentation consumes semantic identity, including under recovery.

Phase 2: Executable Product

Status: complete. Checked tuple facts lower through MIR, structural destruction, closed runtime types, MachineLayoutStore, ABI classification, and machine operations. Native coverage includes argument and return passing, nested tuples, projection mutation, partial moves, disjoint loans, reverse-order drop, and tuples containing borrowed or allocating values.

Phase 3: Practical and Tooling Integration

Status: complete. Formatting, highlighting, hover, completion, inlay hints, navigation, and error-recovery behavior consume shared syntax and semantic authorities. str.split_once provides a borrowed two-part result, and examples/tuples.nct exercises owned returns, projection mutation, rvalue projection, destructuring, discards, and reverse destruction without replacing named records. The Phases 1–3 implementation review traces the complete authority chain and records the shared-boundary defects closed during implementation.

Phase 4: Qualification and Release Preparation

Status: complete. Adversarial follow-up found and closed a source-triggered internal error for noncanonical or oversized tuple positions. One syntax-owned position decoder and exact checking, CLI, and LSP regressions now preserve the source-diagnostic boundary. The release-preparation record fixes the replacement candidate and artifact evidence, and the final review has no open finding. The publication record freezes the tag, asset, and public re-download evidence.

Non-goals

  • empty and one-element tuples;
  • named tuple elements or tuple structs;
  • tuple expansion, variadic tuples, or dynamic indexing;
  • tuple patterns outside local bindings;
  • synthesized operators, coercions, formatting, hashing, or interface implementations;
  • replacing domain records with positional results merely to use the feature;
  • stable foreign tuple ABI or another native target.