v0.23.0: Complete Integer Text APIs
Status: Phase 0 through Phase 3 complete and reviewed (2026-08-31); release preparation has not started. v0.23.0 completes the integer text surface before another target or application domain is added. Public behavior is current working-tree behavior in Practical Standard Library.
Release Boundary
Every built-in integer owns the same three operations:
Type.parse(text)performs allocation-free, complete-input decimal parsing intoType?;value.to_string()returns the canonical decimalStringunder ordinary allocation policy;value.try_to_string(allocator)returns the same spelling using a recoverable allocator.
The ten types are i8, i16, i32, i64, isize, u8, u16, u32, u64, and usize. Type-named free functions are removed rather than retained as aliases. This milestone adds no floating point, char, arbitrary radix, locale, generic numeric interface, or public integer-conversion matrix.
Authority Model
Input is scanned exactly once by one unsigned or signed decimal parser inside std/num. The scan produces a range-checked u64 or i64; destination-specific code checks only the narrower range and performs no lexical work. Lossless same-range conversions remain ordinary as conversions. Narrow destinations cross private, exact-source/exact-result primitives because public as intentionally rejects narrowing. No generic unchecked primitive can be instantiated with an unrelated type.
Output remains owned by std/fmt. Numeric methods allocate a destination and call the same type-specific append contracts used by interpolation and Format; std/num does not implement a second digit generator. std/fmt does not depend on std/num, so the dependency graph remains acyclic.
Phase 0: Contract and Boundary
Status: complete. Fix the public syntax, accepted decimal grammar, canonical result spelling, allocation behavior, destructive removal boundary, dependency direction, and private narrowing contract before source implementation.
Acceptance requires the specification to distinguish current v0.22.0 behavior from the adopted v0.23.0 direction and to forbid parser rescans, copied type grammars, formatter duplication, generic unchecked narrowing, and compatibility wrappers.
Phase 1: Shared Decimal Authorities
Status: complete and reviewed. The Phase 1 review records the one-pass signed and unsigned parsers, exact-type private narrowing roles, formatter dependency boundary, native standard numeric tests, and focused compiler qualification.
The new num/decimal.nct responsibility replaces three independent scans with one full-width signed or unsigned scan followed by a range-only destination publication. The existing u8 conversion and five exact-source/exact-result private primitives cover narrow destinations without adding a generic unchecked escape hatch. std/fmt remains the only digit generator.
Acceptance requires one lexical scan per parse call, exact full-range u64 and i64 handling, private exact-type narrowing contracts, and no additional public surface. These gates pass.
Phase 2: Complete Type-Owned Surface
Status: complete and reviewed. The Phase 2 review records the thirty type-owned declarations, destructive legacy removal, separated text adapters, consumer migration, public-surface native test, and normalized editor presentation.
All ten primitive integer contract blocks now own parse, to_string, and try_to_string. num/text.nct contains only owned-storage adapters over std/fmt; num/tests.nct exercises the public surface independently from parser-internal boundary tests. Four application examples use receiver methods without importing a type-named helper.
Acceptance requires no legacy callable in standard or example source, generated standard-library contract presentation, completion, hover, or definition results, and no type with a partial text surface. Historical specification text may name removed declarations only to state that they are not compatibility APIs. These gates pass.
Phase 3: Qualification and Review
Status: complete and reviewed. The Phase 3 review records boundary, allocator, native, editor, example, full-workspace, and cross-responsibility qualification.
The qualification covers empty and malformed input, signs, leading zeroes, every destination minimum and maximum, adjacent out-of-range text, allocator success and failure, and parse(value.to_string()) == value. Native standard-library and example programs run alongside editor queries over representative signed and unsigned contracts.
Acceptance requires formatting, documentation generation, locked workspace tests, warnings-denied Clippy, native build/run, repository integrity checks, and a full review covering legacy residue, duplicate authority, recomputation, dependency reversal, leaky contracts, and caller-discipline assumptions. These gates pass.