`.
+- `CommandsType` — extracts the command union.
+- `CommandType
` — extracts a single command member by name, prettified.
+- `ProgramType
` — unwraps `Program` to get `T`.
+
+What is normative:
+
+- The convention that extraction helpers operate on parser types, not on
+ extracted value types. [Directly stated by the project lead.]
+- Any provided extraction helper MUST produce correct types for the supported
+ composition patterns.
+
+What is the current intended direction but may evolve:
+
+- The exact set and naming of helpers listed above is the current observed
+ roster. Future versions may add, rename, or restructure these helpers as the
+ type-level architecture matures.
+
+> **Open.** Whether this set is complete — and in particular whether a
+> `ConfigFileType` or similar helper for config-file authoring shapes is needed
+> — is an unresolved question (see §13.7 and §17).
+
+### 13.3 No hidden defaults
+
+`Parser` MUST NOT default `T` to `unknown` or `any`. A bare `Parser` without
+a type argument MUST be a compile error. Generic interfaces and functions in the
+public API MUST NOT default type parameters to `unknown` or `any`.
+
+### 13.4 Forbidden patterns
+
+Public API generic signatures MUST NOT use key-remapping patterns
+(`[C in T as C["name"]]`) that TypeScript cannot reverse-infer from object
+literals.
+
+Type extraction helpers that may produce unions MUST NOT apply non-distributed
+mapped type transformations (e.g., `{ [K in keyof T]: T[K] }` directly on a
+union, which collapses to `{}`).
+
+### 13.5 Computed maps and annotation
+
+When command maps are built dynamically (via `reduce()`, `Object.fromEntries()`,
+or similar), TypeScript may erase literal key types before `commands()` is
+called. This is a TypeScript limitation, not a library defect.
+
+This specification distinguishes two cases:
+
+- **Fully runtime-derived maps** (keys from IO or runtime values): inference
+ produces `unknown`. Explicit type annotation is REQUIRED. This is out of scope
+ for the inference guarantee (§16).
+- **Statically computable but TypeScript-widened maps** (keys derivable from
+ static information, but erased by `Object.keys()` or `reduce()`): inference
+ requires explicit annotation, but the annotation burden may be reducible. The
+ `satisfies` operator is the RECOMMENDED pattern.
+
+`commands()` MUST infer correctly from whatever type it receives — the
+limitation is upstream of the library.
+
+> **Open.** The exact boundary between "inference must work" and "annotation
+> required" for statically-computable-but-widened maps is not precisely defined.
+> Whether the library should invest in reducing annotation burden (via identity
+> helpers, `const` generics, or documented patterns) is a product-design choice,
+> not a settled contract question. See §17.
+
+### 13.6 Display quality
+
+TypeScript tooltip display (e.g., showing `CommandsOf<{...}>` instead of the
+expanded union) is not under Configliere's control.
+
+> **Non-normative.** Display quality is an ergonomic goal the project cares
+> about but cannot guarantee. Implementations SHOULD pursue display improvements
+> where possible, but display quality regressions are not treated with the same
+> severity as inference correctness regressions.
+
+### 13.7 Config-file type extraction
+
+> **Open.** `ConfigType` extracts the parsed runtime output type. For
+> `object()` parsers, this coincides with the config-file authoring shape. For
+> `commands()` parsers, it does not — the parsed output is a `Command`
+> union, while a config file would contain a record keyed by command name.
+> Whether a separate extraction concept is needed for config-file typing is an
+> open design question. See §17.
+
+---
+
+## 14. Error Model
+
+### 14.1 Parse failure
+
+When a field fails validation, `inspect()` MUST produce a `Fail` result with the
+validation error. `ObjectValidationError` aggregates child failures with their
+paths.
+
+### 14.2 Command mismatch
+
+When no command matches the input, `commands()` MUST produce a
+`NoCommandMatchError` listing available commands.
+
+### 14.3 Help on failure
+
+When `program()` detects `--help`, it MUST produce help text even if the
+underlying parse would fail. The help/version screening occurs before config
+parsing.
+
+### 14.4 Error provenance
+
+Validation errors SHOULD include the field path and the failing source's
+identity where possible.
+
+---
+
+## 15. Extension and Evolution Model
+
+### 15.1 Parser composition as the extension mechanism
+
+New functionality SHOULD be added through parser composition — new combinator
+functions that return `Parser` — not through special-case hooks or
+configuration flags.
+
+### 15.2 Phased/injected growth
+
+Multi-phase parsing MUST remain compositional. New phases are added by nesting
+`inject()` inside existing parsers. There MUST NOT be a global phase registry or
+orchestration layer.
+
+### 15.3 Command extension
+
+New commands are added by extending the map passed to `commands()`. The type
+system reflects the extension through union widening.
+
+### 15.4 Schema enrichment
+
+Configliere delegates field validation to Standard Schema. New schema libraries
+can be adopted without changes to Configliere, as long as they implement the
+Standard Schema specification.
+
+### 15.5 Constraint against special cases
+
+Implementations SHOULD NOT introduce behaviors that only work for specific
+parser types (e.g., help features that only work with `program()` but not with
+standalone `commands()`). When special behavior is needed, it SHOULD be
+expressed through the type system (e.g., `D = void` making `inject()` resolvable
+during inspect).
+
+---
+
+## 16. Explicit Non-Goals
+
+The following are not supported by the current architecture. Each is graded by
+the strength of evidence for its exclusion.
+
+1. **Env-var-based command selection.** No `COMMAND=serve` mechanism exists.
+ Commands are selected by CLI arguments only. [Not implemented; never
+ discussed as a possibility.]
+
+2. **Config-file-based command selection.** This was implemented and explicitly
+ removed by the project lead. [Directly rejected — the strongest evidence for
+ any non-goal in this list.]
+
+3. **Exact inference for fully runtime-derived maps.** When keys come from
+ runtime values (e.g., `Object.fromEntries(runtimeKeys.map(...))`), TypeScript
+ erases literal types before Configliere's API is called. This is a TypeScript
+ limitation, not a library defect. [Outside the supported model — not a design
+ rejection, but a platform boundary.]
+
+4. **Exact pre-resolution help for dependency-generated parser structure.** A
+ parser whose commands depend on unresolved runtime state cannot enumerate
+ those commands before resolution. [Architectural impossibility — not a design
+ choice, but a logical consequence of the phased model.]
+
+5. **Display-quality guarantees for TypeScript tooltips.** TypeScript controls
+ how type aliases are displayed in editor tooltips. Configliere cares about
+ display quality as an ergonomic goal but cannot guarantee it. [Outside the
+ library's control — not a rejection, but a platform limitation.]
+
+6. **Structure-only introspection without input.** `inspect()` requires a
+ `ParseContext`. There is currently no "describe your structure without
+ parsing" operation. [Not implemented; not requested in transcripts. Whether
+ it _should_ be supported is an open question (§17), but it is not currently
+ offered.]
+
+7. **Automatic help accumulation across phases.** Cross-phase help assembly is
+ currently the application's responsibility. [Not implemented. Whether the
+ library should provide a utility is an open question (§17), but no such
+ utility currently exists.]
+
+---
+
+## 17. Open Questions and Transitional Areas
+
+The following areas are unresolved and MUST NOT be silently treated as settled:
+
+1. **Provenance preservation of original env keys after scoping.** After
+ `scope()` transforms env keys, the original key (e.g., `SERVE_PORT`) is lost.
+ This conflicts with the project's inspectability emphasis. Whether to track
+ pre-scoping identity is an open design question.
+
+2. **Nested command env semantics.** Whether `API_USERS_PORT` should reach a
+ `port` field inside `api > users` is mechanically plausible but untested and
+ undiscussed. The spec does not guarantee specific nested-command env
+ behavior.
+
+3. **Config-file authoring type extraction.** `ConfigType` extracts the
+ parsed output type, not the config-file authoring shape. For commands, these
+ differ. Whether a separate `ConfigFileType
` or equivalent is needed is
+ unresolved.
+
+4. **Computed-map inference boundary.** Where "inference must always work" stops
+ and "annotation required" begins is not precisely defined for
+ statically-computable-but-TypeScript-widened maps.
+
+5. **Scoped-wins ordering guarantee.** Whether `scope()` must guarantee that
+ command-prefixed env vars always beat global env vars of the same derived
+ key, regardless of insertion order, is not yet normative.
+
+6. **Prefix collision handling.** Whether `scope()` should be made schema-aware
+ to avoid false prefix matches on field names is unresolved.
+
+7. **`ParseContext` field set.** Whether the current six-field `ParseContext`
+ structure is canonical or subject to evolution is not yet decided.
+
+8. **Help accumulation API.** Whether the library provides a utility for
+ combining help from multiple `inspect()` results across phases is not
+ specified.
+
+9. **Progname propagation mechanism.** The most recent observed code uses
+ `ParseContext.progname`. Whether a mutable `Parser.progname` property or a
+ `ParserInfo.parent` field also participate is an implementation detail that
+ may evolve.
+
+10. **Command-scoped help dispatch.** Whether `commands.help()` should match
+ against args and delegate to the matched command's help, or always show the
+ top-level listing, is unresolved.
+
+11. **`toSnake` dependency.** Env-key derivation currently depends on the
+ `ts-case-convert` library for `toSnake` conversion. Whether the spec should
+ define conversion rules independently is open.
+
+---
+
+## 18. Normative Test Agenda
+
+The following test families MUST be maintained. This section names required test
+categories, not exhaustive test cases.
+
+Each test item is marked by purpose:
+
+- **[Verify current]** — confirms behavior observed working in the current
+ implementation.
+- **[Lock down contract]** — asserts an intended invariant that this
+ specification treats as normative.
+
+### 18.1 Source precedence
+
+- CLI args beat env vars [Lock down contract]
+- env vars beat config values [Lock down contract]
+- config values beat defaults [Lock down contract]
+- defaults beat none [Lock down contract]
+- multiple sources provide valid values for the same field [Lock down contract]
+
+### 18.2 Source provenance
+
+- `FieldInfo.source` and `FieldInfo.sources` are always populated [Lock down
+ contract]
+- source types are correct [Verify current]
+- the winning source is identified [Lock down contract]
+- invalid sources are not displayed in help output [Verify current]
+
+### 18.3 Object parsing
+
+- correct type inference from literal maps [Lock down contract]
+- value extraction from all three sources [Lock down contract]
+- CLI arg matching via `scopeInput` [Verify current]
+- path propagation to children [Lock down contract]
+- metadata-only entry defaulting [Verify current]
+
+### 18.4 Command selection and configuration
+
+- command matching by name [Lock down contract]
+- command matching by alias [Lock down contract]
+- default command selection [Lock down contract]
+- config-file value scoping by command key [Lock down contract]
+- env-var scoping by command prefix [Lock down contract]
+- tripartite configuration for selected commands [Lock down contract]
+- `NoCommandMatchError` when no command matches [Verify current]
+
+### 18.5 Environment-variable scoping
+
+- scoped env var reaches the correct field [Verify current]
+- global env var reaches a field inside a command [Lock down contract]
+- scoped env wins over global env of the same derived key [Lock down contract]
+- alias invocation uses canonical name for scoping [Lock down contract]
+- default command receives scoped env vars [Lock down contract]
+
+### 18.6 Help derivation
+
+- `format()` reads `info.help` directly [Lock down contract]
+- field classification (arg vs. opt) [Verify current]
+- object collection of children's help items [Verify current]
+- commands listing in help output [Verify current]
+- program merging of preamble opts with main help [Verify current]
+- progname propagation in help output [Lock down contract]
+
+### 18.7 `inspect()` invariants
+
+- `parse()` results and `inspect().result` agree for the same input [Lock down
+ contract]
+- `help()` output and `format(inspect())` agree for the same input [Lock down
+ contract]
+- every `ParserInfo` has result, remainder, and help [Lock down contract]
+- container parsers embed child info [Verify current]
+- `FieldInfo` always has source and sources [Lock down contract]
+
+### 18.8 Phased parsing
+
+- inject returns empty help [Verify current]
+- resolved parser has full help [Lock down contract]
+- resolved parser has baked context [Lock down contract]
+- context (progname, args) flows through resolution [Lock down contract]
+
+### 18.9 Type inference
+
+Compile-time type tests:
+
+- `object()` infers exact value type from literal map [Lock down contract]
+- `commands()` infers exact command union with literal name strings [Lock down
+ contract]
+- `ConfigType` extracts `T` from `Parser` [Lock down contract]
+- `CommandType` extracts named command member [Lock down contract]
+- `ProgramType` extracts inner config type [Lock down contract]
+- `commands()` does not collapse to `Command` [Lock down
+ contract]
+- `ConfigType` on command union does not collapse to `{}` [Lock down contract]
+- bare `Parser` without type argument fails to compile [Lock down contract]
+
+### 18.10 Helper extraction
+
+Tests MUST verify that provided extraction helpers (currently `ConfigType`,
+`CommandType`, `CommandsType`, `ProgramType`) extract correct types from parser
+instances. [Lock down contract — for whatever helpers exist at the time.] If the
+helper set evolves, tests MUST cover whatever helpers are provided.
+
+---
+
+_This specification is derived from reverse-engineering research across 13
+transcript sessions and current library source code. Items marked **Open** or
+**Transitional** represent areas where the evidence does not support firm
+normative language. Interface snippets labeled **Illustrative** show the current
+observed shape rather than an exact permanent contract. Evidence-graded notes
+throughout distinguish settled contract from current intended direction and
+provisional interpretation. The specification aims to be strong enough to guide
+implementation and testing while remaining honest about what is established and
+what is still being determined._