You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**`secretzero web`:** one-shot, bindable FastAPI UI over the network (bootstrap token, session + CSRF, optional TLS): dashboard with manifest/lock metadata, per-secret sync/rotate, **per-target “Force to target”** when multiple targets exist and another lane is already synced (`SyncEngine.sync(..., force_targets=...)`), static value edit (forces target writes), optional `--debug` sync log panel, sync-all, logout, shutdown. CLI parity: `secretzero sync -s <name> --force-target <target_id>` (repeatable). See `.mex/patterns/secretzero-web.md`.
34
+
-**Lockfile sync identity:** On each non–dry-run sync that updates secretfile tracking, `.gitsecrets.lock` → `secretfile.sync_identity` records client surface (`cli`, `api`, `agent`, `network_web`), OS user/host/platform, git `user.*` + short `HEAD` at the Secretfile directory, optional env label (`SZ_SYNC_ENVIRONMENT`, `ENVIRONMENT`, `ENV`), and detected CI actor/repo/run URL when present. Each successful target write also appends to `target_provenance` (same snapshot, last 3 per target). See `.mex/patterns/lockfile-sync-identity.md`.
35
+
-**Secretfile manifest versioning:** Root `version` is no longer required in `Secretfile.yml`; lockfile tracking now records `secretfile.manifest_spec_version` (currently `1`) in `.gitsecrets.lock` for future manifest migration compatibility.
36
+
-**Provider token introspection:** All built-in providers now implement `ProviderAuth.get_token_info()` (or `InfisicalProvider.get_token_info()`) where the upstream API supports it—AWS STS, Azure JWT claims, Vault `lookup-self`, GitLab user, Jenkins `get_whoami`, Kubernetes kubeconfig host/context, Ansible Vault password *mode* (never the password), plus existing GitHub. `BaseProvider.get_actor_info()` merges this into sync `actor` metadata on target writes.
37
+
-**Provider identity UI:**`collect_provider_identity_rows()` (`src/secretzero/provider_identity.py`) resolves each `providers:` entry via `get_actor_info()`; shown as a Rich table before `secretzero sync` / `secretzero status` (text), `provider_identity` in JSON, and a **Provider identity** table on the `secretzero web` dashboard manifest header.
38
+
-**Agent skill guidance refreshed:**`skills/secretzero/SKILL.md` now includes explicit Secretfile authoring rules that prioritize whole-secret modeling and straightforward template usage.
39
+
-**Lockfile write guard:** sync/agent/API flows no longer persist empty skeleton lockfiles; `Lockfile.save()` now skips (and removes) files when state is semantically empty.
40
+
-**Provider kind fallback:** When a `providers:` entry omits top-level `kind`, sync and `secretzero init` now treat the YAML key as the provider kind (e.g. `providers.aws` → `aws`). Previously `model_dump()` produced `kind: null` and AWS never registered (`Provider not initialized`).
41
+
-**Structured secret hashing:** Lockfile hashing now accepts non-string secret payloads (e.g. JSON objects for multi-field static secrets) via canonical JSON normalization before SHA-256, preventing `'dict' object has no attribute 'encode'` during sync.
42
+
-**Example manifest:**`examples/azure-appreg-to-aws-sm.yml` uses a structured static `value` map with YAML `null` leaves so interactive `secretzero sync` prompts once per missing field (sorted keys); `.szvar` / `--var-file` can pre-fill those leaves to skip prompts.
43
+
-**Static dict prompting:**`StaticGenerator` now fills dict/object static secrets by prompting for each scalar leaf that is `null`, blank, or a lone `${VAR}` placeholder (nested leaves only; top-level empty string remains a deliberate value). `static_payload_needs_prompt()` drives agent auto-sync classification for structured static secrets.
44
+
-**Variable context / lockfile:**`variables_hash` was never persisted, so `variable_context_changed` was always true for manifests with `variables:` (vs `null` in the lock), forcing `ignore_foreign_context_targets` and spurious re-prompts. Missing baseline now means “not changed”; `secretzero sync` calls `track_variable_context` before saving the lockfile so real variable / `.szvar` changes are detected on subsequent runs.
45
+
-**CLI rotate filtering:**`secretzero rotate --secret <name>` / `-s` (repeatable) limits rotation to those manifest secrets; same as optional positional `SECRET_NAME`, but do not combine `-s` with the positional.
34
46
35
47
**Not yet built:**
36
48
- Autonomous/scheduled secret rotation service (rotation is operator-invoked).
Use when extending **who / where / CI** metadata persisted on sync (not secret values).
4
+
5
+
## Where it lives
6
+
7
+
-**Schema:**`LockfileSyncIdentity` and `SecretfileMetadata.sync_identity` in `src/secretzero/lockfile.py`
8
+
-**Collection:**`collect_lockfile_sync_identity()` in `src/secretzero/sync_identity.py` (host, user, git config/HEAD at Secretfile parent, CI env — **no tokens**)
9
+
-**Wiring:**`SyncEngine` (`sync_client`, optional `sync_identity` override, `sync_identity_cwd`) calls `Lockfile.track_secretfile(..., sync_identity=...)` once per run and passes the same snapshot into `record_target_update` for per-target provenance
# Composable env block that can be overridden at runtime to provide dynamic values for generators and targets. This allows for flexibility in how secrets are generated and where they are stored without needing to change the Secretfile.
0 commit comments