Repository navigation
fix(doppler): accept any secret name, null values and full config inheritance - #23
Merged
Merged
Conversation
…eritance Callers can now pass any secret name to updateSecret and read any secret name from listSecrets and updateSecret responses. The spec had modeled these maps from its STRIPE/ALGOLIA/DATABASE example. A change request accepts originalName and value as null, as the docs and both Doppler clients require. Restricted secrets decode with null raw/computed. Every config response now carries slug, inheritable, inheriting, inherits and inheritedBy. Service account identity claims accept any claim name. Service token keys and OIDC request tokens are Redacted. Never-seen last_seen_at and no-expiry expires_at decode as null. secret-visibility.patch.json is folded into secrets.patch.json. Claude-Session: https://claude.ai/code/session_01EYBKWh5PaTXsDr9XVLm7sD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Doppler's OpenAPI spec models secret maps from its example (
STRIPE,ALGOLIA,DATABASE). It also leaves out the config inheritance fields on most config responses and misses several nullable and credential fields. The fix is spec patches only.src/services/doppler.tsis regenerated.secrets.patch.json(new, absorbssecret-visibility.patch.json)config-object.patch.json(new){project, config}itemsservice-account-identities.patch.json(new)claimsmap, movesttl_seconds/created_at/last_seen_atfrom create'sconfigonto the identity, nullablelast_seen_atservice-tokens.patch.json(new)keyand deletetoken, typed nullableexpires_at(wasunknown)service-account-tokens.patch.json(new)last_seen_at(create wasunknown) andexpires_atauth-me.patch.json(new)last_seen_atoidc-auth.patch.jsontokenSources are the Doppler CLI (
pkg/models/api.go:156-170,pkg/models/parse.go:107-155,308-309,326,pkg/cmd/secrets.go:438-443), the Terraform provider (doppler/resource_secret.go:136-149,197-198,doppler/models.go:247-266,362-379), the docs, and live calls. Each patch'sdescriptioncites its own.Evidence
Repro script (not committed) through the generated SDK with
ResponseValidation.strictand mocked responses. Lines that changed:Before:
After:
Before (caller code type-checked against the SDK):
After:
tsc exit=0Live (2026-10-13, config service token, read-only, strict validation, shapes only):
There was no full create/delete e2e. 1Password holds only config-scoped service tokens, which cannot create projects, environments, service accounts or service tokens.
pnpm typecheck:ci,pnpm specs:check,pnpm lintandpnpm patches:audit dopplerall pass. The audit reports 9 patch files, all needed.Not fixed here:
listSecrets/updateSecretrecord values and thesecretsrequest map are typedRedactedbut stay plain strings at runtime (livelistSecretsabove). CorewrapSensitiveskips Records, and the generator dropssensitiveon map values. That needs a separate core PR.initial_fetch_at/last_fetch_atmay be null for never-fetched configs. There is no evidence yet.projectis a query param in the spec, but both clients send it in the body. Service tokenexpire_atis a string in the spec, but the CLI sends an integer. Neither is verified live.Merge Danger
Door: two-way
Revert the commit to roll back. Nothing is persisted or migrated.
Blast Radius: type-names
Exported types renamed or removed:
UpdateSecretRequestSecretsbecomesUpdateSecretRequestSecretsMap.ListSecretsResponseSecrets*andUpdateSecretResponseSecrets*become...SecretsMap/...SecretsValue. The identity...ConfigClaims,...ClaimsAudListand...ClaimsSubListtypes become...ClaimsMapand...ClaimsValueList. The other config response types are no longer aliases ofCloneConfigResponseConfig. Callers that imported those names will fail to compile. Callers of the operations keep working, and fields that changed toRedactednow needRedacted.value.https://claude.ai/code/session_01EYBKWh5PaTXsDr9XVLm7sD