GoForge — Build | Test | Ship | Collaborate GoForge — Build | Test | Ship | Collaborate
v1.0.4

Viper

Configuration with provenance and immutable snapshots

$ go get goforge.dev/gpviper@v1.0.4

Current release — v1.0.4. goforge.dev/gpviper is at 100% feature parity with spf13/viper v1.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 with go 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.