# Slovo Collection Ledger Status: beta design ledger for `1.0.0-beta.15`. This document inventories the current concrete collection and value-family surface without redefining the generated public API catalog. Exact exported helper signatures live in [`STDLIB_API.md`](STDLIB_API.md), which is generated from `lib/std/*.slo`. This ledger records design boundaries, pressure, and promotion prerequisites for future generic collection work. `1.0.0-beta.15` is documentation/design and compiler-boundary hardening. It does not change the source language, typed core, runtime, standard-library/API surface, diagnostic output shape, diagnostic codes, diagnostic schema, benchmark metadata schema, ABI/layout behavior, or performance claims. It does reword current reserved generic/map/set diagnostic prose from beta.9-specific text to current-beta wording. ## Catalog Boundary [`STDLIB_API.md`](STDLIB_API.md) remains the source of truth for current exported standard-library helper signatures. It normalizes module-local concrete aliases such as `VecI32`, `OptionString`, and `ResultU64` to concrete public types, and omits non-exported helpers and `(type ...)` aliases. This ledger intentionally does not duplicate generated module or helper counts. If an exact signature or count is needed, use the generated catalog. If this ledger and the catalog drift, the catalog describes the generated API surface while this file describes the intended design boundary. ## Current Concrete Surface | Surface | Current concrete families | Public catalog reference | Boundary | | --- | --- | --- | --- | | Concrete vectors | `(vec i32)`, `(vec i64)`, `(vec f64)`, `(vec bool)`, `(vec string)` | [`std.vec_i32`](STDLIB_API.md#stdvec_i32), [`std.vec_i64`](STDLIB_API.md#stdvec_i64), [`std.vec_f64`](STDLIB_API.md#stdvec_f64), [`std.vec_bool`](STDLIB_API.md#stdvec_bool), [`std.vec_string`](STDLIB_API.md#stdvec_string) | Concrete immutable value-family helpers over the existing vector runtime names. No generic vector dispatch, element-level mutation, slice/view API, iterator API, nested vector family, new runtime helper name, stable helper-symbol contract, or ABI/layout promise is implied. | | Option value families | `(option i32)`, `(option u32)`, `(option i64)`, `(option u64)`, `(option f64)`, `(option bool)`, `(option string)` | [`std.option`](STDLIB_API.md#stdoption) | Concrete constructors, observers, unwrap/fallback helpers, and option-to-result bridges. No generic option helper, mapping/chaining API, transpose/flatten family, stable API freeze, or payload-family expansion is implied. | | Result value families | `(result i32 i32)`, `(result u32 i32)`, `(result i64 i32)`, `(result u64 i32)`, `(result f64 i32)`, `(result bool i32)`, `(result string i32)` | [`std.result`](STDLIB_API.md#stdresult) | Concrete `i32` error-code result helpers. No generic result helper, rich error ADT, mapping/chaining API, transpose/flatten family, stable API freeze, or alternate error payload family is implied. | | Host and parsing result/option flows | Concrete option/result values returned by current host, CLI, file, network, parse, and numeric helpers | [`std.cli`](STDLIB_API.md#stdcli), [`std.env`](STDLIB_API.md#stdenv), [`std.fs`](STDLIB_API.md#stdfs), [`std.io`](STDLIB_API.md#stdio), [`std.net`](STDLIB_API.md#stdnet), [`std.num`](STDLIB_API.md#stdnum), [`std.string`](STDLIB_API.md#stdstring) | These helpers expose the same concrete value families through ordinary source facades. They do not create generic payload types, generic host errors, stable ABI names, or a stable compatibility freeze. | Fixed arrays are part of the current language surface, but they are not a standard-library helper family in the generated API catalog. Future work that connects arrays to slices, views, iterators, maps, sets, or generic collection helpers must define its own language, runtime, diagnostic, and documentation contract. ## Design Pressure The current surface deliberately repeats concrete helper families. That duplication has been useful because each family could be promoted with narrow tests and without a generic type system, but it now creates clear pressure: - Vector helpers repeat construction, indexing, fallback, search, query, concatenation, slicing-by-copy, replacement, and removal names across five concrete element families. - `std.option` and `std.result` repeat constructor, observer, unwrap, fallback, and bridge helpers across concrete payload families, including the unsigned payloads added before beta. - Helper parity can drift between concrete modules, as shown by the beta12 vector query and prefix parity release. - Module-local concrete aliases reduce source repetition inside facades, and the generated catalog hides those aliases from public signatures, but aliases do not define generic API compatibility or migration behavior. - Host and parsing facades spread concrete option/result values through the broader API surface, so future generic work must account for both dedicated `std.option`/`std.result` modules and callers that already depend on concrete return types. This pressure is a reason to design generics carefully, not a license to infer generic behavior from existing concrete helpers. ## Promotion Prerequisites Before any executable generic collection feature is promoted, a release must define and gate the full contract for that feature. At minimum: - Executable generics need source syntax, type-parameter rules, explicit inference policy, type-checking behavior, formatter layout, typed-core representation, lowering/monomorphization or dispatch strategy, diagnostic coverage, public documentation, examples, and migration rules for existing concrete helpers. - Generic aliases need a separate alias contract, including parameter syntax, allowed targets, cycle checks, export/import visibility, formatter behavior, diagnostics, and the relationship to runtime layout and public API docs. - Maps and sets need key/value constraints, equality and hashing or ordering policy, construction and update semantics, iteration order or non-order policy, error behavior, runtime/resource ownership, diagnostics, and public API stability rules. - Iterators need an ownership and lifetime model, exhaustion semantics, composition rules, interaction with `match` and future loops, diagnostics, and guarantees about whether iteration is copying, borrowing, or consuming. - Mutable vectors need element-mutation syntax, aliasing and ownership rules, capacity/reallocation behavior, interaction with whole-value `var` / `set`, runtime helper names, trap/error behavior, diagnostics, and layout/ABI boundaries. - Slice/view APIs need borrowing or ownership rules, bounds behavior, invalidation rules when mutation exists, array/vector/string applicability, formatter behavior, diagnostics, and runtime representation boundaries. - Any stable stdlib/API claim needs explicit stable and experimental tiers, compatibility and deprecation policy, migration tests, generated API-doc behavior, and release-gate coverage. Until those prerequisites are satisfied by a specific release, the current concrete families remain the entire supported collection/value-family surface. ## Unsupported Boundaries Current diagnostics that reject generic aliases, unsupported alias targets, unsupported collection forms, unsupported vector element types, maps, sets, iterators, slice/view APIs, mutable element operations, or broader option/result payload shapes are boundary diagnostics. They document where the current beta stops. `1.0.0-beta.15` does not add, remove, rename, or reclassify diagnostic codes. It does not change the `slovo.diagnostic` schema, JSON/S-expression output shape, spans, expected/found values, hints, or human-readable diagnostic prose policy. The only diagnostic-fixture change in this release is reserved-boundary message text that no longer names beta.9 as the unsupported stage. Future releases that change diagnostics for collection boundaries must do so through the diagnostic policy in [`DIAGNOSTICS.md`](DIAGNOSTICS.md) and their own release gates. ## Explicit Non-Changes This ledger does not promote: - executable generics - generic aliases or parameterized aliases - generic stdlib dispatch - maps or sets - iterator APIs - mutable vector APIs - slice/view APIs - new runtime names or helper symbols - stdlib/API additions, removals, or renames - diagnostic output shape, code, schema, span, expected/found, or hint changes - benchmark metadata schema changes - ABI/layout guarantees - performance claims or thresholds - a stable `1.0.0` stdlib/API freeze