Viper
Configuration with provenance and immutable snapshots
Current release —
v1.0.4.goforge.dev/gpviperis at 100% feature parity withspf13/viperv1.21.0 (all 192 declarations, differential tested; ~8.6x faster immutable lookup), race/vet clean. The current line consumes capability-scoped source loading from Go+ stdlib v0.207.0. Install withgo get goforge.dev/gpviper@v1.0.4.
GoForge Viper targets spf13/viper v1.21.0. Its compatibility facade retains
familiar configuration entry points while its Go+ semantic API makes keys,
schemas, source provenance, and immutable snapshots explicit.
Current parity
The reproducible inventory contains 192 declarations and all 192 are now implemented. That closes declaration coverage, not the release gate: exhaustive behavioral, integration, fuzz, concurrency, and paired-performance proof remains in progress.
The public configuration-error taxonomy, parse-error unwrapping,
supported-extension inventory, and GetViper global accessor are also
compatible with the pinned release.
Reader-based MergeConfig preserves prior nested settings while overlaying
incoming JSON, YAML, or TOML values.
Parent-object lookup and isolated nested Sub views now match the pinned
behavior for configuration maps.
The unmarshalling family includes key-scoped and exact decoding, weak
conversion, duration/slice defaults, and custom decode hooks.
Construction options now cover instance/global environment-key replacement
and default decode hooks.
Custom nested-key delimiters and default-value-driven result typing are also
differentially compatible.
Filesystem-backed discovery now supports injected afero filesystems,
explicit and searched filenames, extension inference, used-file reporting,
and merge-in behavior.
JSON, YAML, and TOML write-back is byte-compatible, including safe/forced
writes, configured permissions, writer targets, and already-exists errors.
Custom codec registries, finders, logging/debug options, experimental
struct-key environment binding, remote providers, and synchronous/channel
watch updates now have compatibility coverage. Unlike upstream’s channel
watcher, the GoForge implementation serializes mutation so concurrent reads
remain race-free.
Go+ and standard library
The current production implementation is authored in viper.gp and
reload.gp; version-marked Go is generated reproducibly by the pinned Go+
compiler. Resolution[T] exhaustively distinguishes
ResolvedValue(value,source) from MissingResolution.
This project also forced std/config: typed keys, schema-indexed immutable
snapshots, provenance, required-key evidence, and typed projection. The next
stdlib slice adds capability-scoped source loading and ordered reload events
without putting Viper-specific precedence policy in std.
Performance
Immutable snapshot lookup is conservatively 8.62× faster than the pinned upstream lookup with 100% fewer allocations. Discovery, decoding, reload, provider, and compatibility paths still require paired gates.
Release gate
The declaration inventory has reached zero deferred rows. Release still requires complete differential, race/integration, fuzz, and paired benchmark suites, consumption of released matching Go+/stdlib tags without a local replacement, and resolve from a clean external module. The release repository is pulled immediately before tagging.