checkId: check.environment.secrets plugin: stellaops.doctor.environment severity: warn tags: [environment, secrets, security, rotation, expiry]
Environment Secret Health
This stella doctor check surfaces secrets that are expired, expiring soon, or overdue for rotation across every managed environment, so operators can rotate credentials before they cause authentication outages or violate rotation policy.
What It Checks
Queries the Release Orchestrator secrets status API (/api/v1/environments/secrets/status) for metadata about all configured secrets (no actual secret values are retrieved). Each secret is evaluated for:
- Expiry – secrets already expired, expiring within 7 days (critical), or expiring within 30 days (warning)
- Rotation compliance – if a rotation policy is defined, checks whether
lastRotatedexceeds the policy interval by more than 10% grace
Severity is assigned by the first matching rule, in order:
- Fail – any production secret has already expired
- Fail – any secret (in any environment) has expired, or a production secret is expiring within 7 days
- Warn – any secret is expiring within 7 days (non-prod), expiring within 30 days, or has overdue rotation
- Pass – all secrets are healthy
Why It Matters
Expired secrets cause immediate authentication and authorization failures. Services that depend on expired credentials will fail to connect to databases, registries, external APIs, and other integrations. In production, this means outages. Secrets expiring within 7 days require urgent rotation to prevent imminent failures. Overdue rotation violates security policies and increases the blast radius of a credential compromise.
Common Causes
- Secret expired without automated rotation being configured
- Rotation job failed silently (scheduler down, permissions changed)
- Secret provider (Vault, Key Vault) connection lost during rotation window
- Manual secret set with fixed expiry and no follow-up rotation
- Rotation policy interval shorter than actual rotation cadence
How to Fix
Neither
stella env secrets …norstella secrets provider statusexists. Verified 2026-07-28 against the built CLI:
stella env secrets list --expiringexits 2 —Unrecognized command or argument 'env'. Noenv/environmentcommand is registered at any depth. Tracked as CLI-2 indocs/implplan/SPRINT_20260727_003_Cli_release_environment_command_surface.md.stella secrets …parses, which makes it more dangerous than a plain typo:cli-routes.jsonmapssecrets→scan secretsas a hidden deprecated alias (“Secret detection consolidated under scan (not secret management)”). That is secret detection scanning. It has noprovider statussubcommand, and it is not the secret-management surface this article meant.Earlier revisions published
stella env secrets list|rotate|rotate-scheduledandstella secrets provider statusas remediation steps. All were fabricated. There is no CLI surface for secret lifecycle management — rotation and expiry are driven from the Console and from your secret provider (Vault, Key Vault) directly.stella kms export|importmoves file-backed signing key material and is unrelated;stella key rotate <anchorId> <oldKeyId> <newKeyId>rotates trust-anchor keys, also unrelated to environment secrets.
Docker Compose
# Report expiring/expired secrets (evidence block lists them)
stella doctor run --check check.environment.secrets --format json
# Update secret in .env file for compose deployments
# Edit devops/compose/.env with the new secret value
# Then restart affected services
docker compose -f docker-compose.stella-ops.yml restart <service>
Bare Metal / systemd
# Report expiring/expired secrets
stella doctor run --check check.environment.secrets --format json
# If using file-based secrets, update the file
sudo vi /etc/stellaops/secrets/<secret-name>
sudo chmod 600 /etc/stellaops/secrets/<secret-name>
sudo systemctl restart stellaops-<service>
Scheduled rotation is configured in your secret provider, not in the Stella Ops CLI.
Kubernetes / Helm
# Report expiring/expired secrets
stella doctor run --check check.environment.secrets --format json
# Rotate the secret in your provider, then update the Kubernetes secret
kubectl create secret generic <secret-name> \
--from-literal=value=<new-value> \
-n stellaops-<env> --dry-run=client -o yaml | kubectl apply -f -
# Restart pods to pick up new secret
kubectl rollout restart deployment/<service> -n stellaops-<env>
# For external-secrets-operator, trigger a refresh
kubectl annotate externalsecret <name> -n stellaops force-sync=$(date +%s)
Verification
stella doctor run --check check.environment.secrets
Related Checks
check.environment.connectivity- expired agent credentials cause connectivity failurescheck.environment.deployments- services fail when their secrets expirecheck.integration.secrets.manager- verifies the secrets manager itself is healthy
