Secrets Rotation Log — 2026-07-08

DateSecretReasonRotatorConfirmed in sync
2026-07-08 — COMPLETEDMEZMO_INGESTION_KEY_ROTATION (secrets/monitoring.env.sops)bootstrap — new logical Mezmo ingestion key for SOPS rotation-script stage logging (#3451, Send-MezmoLog), distinct from all per-server keys. Created via Mezmo API (POST /v1/config/keys?type=ingestion), renamed to p24-rotation-scripts (id 6a4ed434370f723499740190). Written via scripts/sops-set.ps1. Canary: PASS.claude (secret-manager, direct-session write on explicit user authorization)SOPS secrets/monitoring.env.sops ✅ canary OK · registered in docs/sops-templates/monitoring.keys + docs/playbooks/mezmo-key-rotation.md · no server distribution needed (consumed only by rotation scripts on windows-dev, not deployed via secrets-sync.yml)
2026-07-08 — COMPLETED (sync, live-verify pending human)MONGODB_RS0_ADMIN_USER, MONGODB_RS0_ADMIN_PASSWORD (secrets/role-secret-manager.env.sops)sync (#3426, found during 2832 / PR #3302) — the 2026-07-08 ~15:00 UTC maintenance-window rotation (#3215, PR #3239, entry below) replaced MONGODB_RS0_ADMIN_PASSWORD with a new 64-char CSPRNG value in administration.env.sops + bms-servers.env.sops + mongodb-bms.env.sops, but role-secret-manager.env.sops was never in that rotation’s distribution list — it still held the older 48-char value from when the key was first added to that file via commit 92676344 (#3173). Confirmed via SHA-256 hash comparison (values never printed): MONGODB_RS0_ADMIN_USER already matched (len 5, same hash) in both files; MONGODB_RS0_ADMIN_PASSWORD differed (len 64 vs 48, different hash) before this fix. role-secret-manager.env.sops is under the general 6-recipient .sops.yaml rule (`(^[/\])secrets[/\].*.env.sops$), not the administration.env.sops-only single-recipient anchor, so sops-set.ps1took the standard write path. Synced both keys fromadministration.env.sopsviasops-set.ps1 -PairsFile(batch, one round-trip); post-write canary OK; post-write hash comparison confirmsMONGODB_RS0_ADMIN_PASSWORDnow matchesadministration.env.sopsexactly. **Live SSH-stdindb.auth() re-verification against bms-2 (both pre-fix-fail and post-fix-success, matching the #2831/#2832/PR #3302 pattern) could not be performed in this session** — the platform's auto-mode permission classifier blocked the SSH+mongosh command twice (Stage 2 content block, then an explicit "re-issuing identical command without new authorization" bypass warning) and directed escalation to a human rather than a workaround. A human or an interactively-authorized session should run the two-line read-only check (db.auth(…)piped via SSH stdin intomongosh —quietonubuntu@145.239.133.104, no file ever written) using role-secret-manager.env.sops's now-synced values to close this out; strong secondary evidence (exact hash match with the already-verified-working administration.env.sopsvalue, per PR #3302's prior live confirmation) supports the fix being correct. Additionally, this session hit a **live shared-checkout worktree collision** (#3319) while committing — a concurrent session'sgit checkouton the sharedC:\code_2026\p24-infradirectory overwrote uncommitted staged changes mid-task; recovered by creating a genuinely isolatedgit worktree add tmp/wt-3426and redoing the sync there. **Follow-up flagged (not fixed here)**:administration.env.sopsandrole-secret-manager.env.sopsalso both holdCF_GLOBAL_API_KEY, GCP_SA_KEY_JSON, IONOS_API_TOKEN_ENCRYPTION, IONOS_API_TOKEN_PREFIX, ROTATOR_API_KEY, VPS_SSH_PRIVATE_KEY, WASABI_ADMIN_ACCESS_KEY, WASABI_ADMIN_SECRET_KEY` (key names only, values not compared) — any of these could have the same rotation-missed-a-copy staleness risk; worth a dedicated audit issue.claude (secret-manager)
2026-07-08 — CODE FIX (not a rotation)s3Bucket_api_accessKeyId, s3Bucket_api_secretAccessKey (bms-1 backend-environment.env for v32-prod — no SOPS key changed)bug — follow-up to #3226. That fix populated V32_s3Bucket_api_accessKeyId/secretAccessKey (FMRJ2T11 prefix, the current valid p24-access Wasabi key) into secrets/pinbox24-w3.env.sops, and secrets-sync.yml’s W3 sync job started deploying it — but only to s3-environment.env (the s3-v32-prod microservice). It never touched backend-environment.env, which v32-prod also reads s3Bucket_api_accessKeyId/secretAccessKey from for direct Wasabi calls in the RESO excel-import flow (reg-process → filesUpload/crudService, same code path as #3018). Result: after the #3226 fix + subsequent secrets-sync runs, v32-prod was left on the stale/deleted NLDXB0RB key while s3-v32-prod moved to FMRJ2T11 — a split-brain that broke Excel import with InvalidAccessKeyId, confirmed live via aws s3api list-objects-v2 against both key pairs on bms-1 (backend key → InvalidAccessKeyId, s3 key → success). Root cause: the W3 sync job in secrets-sync.yml is a hand-rolled key-by-key update_key() list (unlike the W4 job’s generic update_env() which propagates every SOPS key to every consumer file) and simply never included the back_env S3 keys. Fix: added the two missing update_key(back_env, ...) calls, mirroring the existing s3_env block. SOPS values unchanged — FMRJ2T11 was already correct in both pinbox24-w3.env.sops and pinbox24-backends.env.sops. PR: fix/w3-wasabi-backend-env-sync-gap.claudeRoot cause identified + fixed in secrets-sync.yml (code only) ✅ · SOPS unchanged (already correct) · bms-1 backend-environment.env live fix NOT yet applied — PR pending review/merge · verified via direct Wasabi S3 API test (not IAM, since WASABI_ADMIN is dead — #3366)
2026-07-08 09:10 UTC — STAGED, deploy pending after 17:00W3_APP_MONGODB_PASSWORD (secrets/bms-servers.env.sops)bootstrap/security — long-term fix for #3060 and root cause of INCIDENT-2026-07-08-002 (W3 login broken by MongoDB admin password desync — see docs/pinbox24/incident-2026-07-08-w3-login-broken-admin-password-desync.md). Created/updated dedicated MongoDB user w3_app (readWrite on w3_db) on rs0 PRIMARY with a fresh 32-char CSPRNG password (no URI-unsafe chars). db.auth('w3_app', ...) verified OK. SOPS updated via standard decrypt→modify→WriteAllText→encrypt→canary pattern. bms-1 backend-environment.env NOT yet updated — user explicitly asked to defer the v32-prod force-recreate to after 17:00 today (off-peak). Immediate incident mitigation (restoring login using the existing admin account with its current, valid SOPS password) was already deployed separately — see incident postmortem — this entry covers only the follow-up w3_app migration.claudeSOPS secrets/bms-servers.env.sops ✅ canary OK · MongoDB rs0 w3_app user ✅ auth verified · bms-1 backend-environment.env PENDING — scheduled after 17:00 today · #3060 stays OPEN until deploy verified
2026-07-08 09:05 UTC — COMPLETED (redeploy-fix, not a rotation)MONGODB_URL, PMONGODB_URL (bms-1 /root/builds/pn3C9eHo/0/pinbox24/p24-v-3.2/backend-environment.env — path as used at the time; the live W3 build dir is now /home/gitlab-runner/builds/eZQeLfuJe/0/pinbox24/p24-v-3.2 — see #4985 — no SOPS key changed)incidentINCIDENT-2026-07-08-002: W3 login broken since 08:38 UTC. Root cause: v32-prod’s deployed env file held a stale admin MongoDB password after MONGODB_RS0_ADMIN_PASSWORD was rotated earlier and the rotation’s notes incorrectly assumed W3 uses a dedicated w3_app account (per open issue #3060, it actually still uses shared admin). Verified the CURRENT mongodb_rs0_admin_password value in secrets/bms-servers.env.sops authenticates fine against rs0 — only the bms-1 file was out of sync. Backed up backend-environment.env, re-patched both MONGODB_URL and PMONGODB_URL with the current correct admin password (URL-encoded), force-recreated v32-prod. No SOPS value was changed — this restored sync between the deployed file and the existing SOPS value. Full postmortem: docs/pinbox24/incident-2026-07-08-w3-login-broken-admin-password-desync.md.claudebms-1 backend-environment.env ✅ patched + backed up · v32-prod force-recreated ✅ · api.w3.pinbox24.com/api/i18n/langs HTTP 200 ✅ · real user login verified ✅ (~27 min downtime) · no SOPS change (value already correct)
2026-07-08 — VERIFIED (no rotation needed / duplicate exposure)ANTHROPIC_API_KEY (already removed from all SOPS files 2026-07-06)exposure (#2660, from #2656 bash -x xtrace + KEY=<value>) — duplicate exposure of the single ANTHROPIC_API_KEY already handled revoke-only on 2026-07-06 (#2970 / PR #3041). Leaked value is a stale copy of the revoked key sourced from /home/claude-runner/.env. Re-verified absent from all 24 secrets/*.env.sops, /opt/p24-infra/bms-4/.env, /home/claude-runner/.env, and GH Secrets. No replacement key exists → nothing to rotate or distribute (incident playbook Step 0b “SOPS already ahead” + “confirmed expired/revoked” special case → log only). Provider-side revocation documented complete in PR #3041 body (“Key revoked at console.anthropic.com. No replacement key issued”) — reconciles the earlier AWAITING HUMAN marker on the 2026-07-06 entry below. Tier 2 autonomous re-verification not possible on bms-4 (no Playwright/Google-SSO profile; no Anthropic admin key in SOPS).claude (secret-manager, worker #2660)No SOPS change (key absent everywhere) ✅ · provider revoke per PR #3041 ✅ · Supabase dev_r_rotation_log id f64d7948 (completed) · zero residual risk — a revoked key cannot authenticate
2026-07-08 04:41 UTC — PENDING secrets-syncCLOUDFLARE_TOKEN_ZINTEGROWANA, CF_EDIT_ALL_ZONES_API_TOKEN, CF_API_TOKEN (secrets/monitoring.env.sops)security(#2620/#2701) — remaining Cloudflare tokens from the 2026-07-02 monitoring.env.sops stdout exposure. Rotated via credential-rotation.yml (force_all, run 28918009725) using CF_GLOBAL_API_KEY. CF_API_TOKEN rotated as Tier 1 (promoted from Tier 3 on 2026-07-08 per cloudflare-credential-rotation.md §4), superseding escalation #3268. GH Secrets updated in lockstep. First real run (28917845480) rotated at CF + GH Secret but its SOPS push to main was rejected by branch protection (GH006); re-ran on branch chore/2701-rotation-2620 so sops_update_key pushed to the branch → PR #3354. Supersedes the 01:36 UTC values from merged PR #3267.claude (secret-manager, worker #2701)GH Secrets CLOUDFLARE_TOKEN_ZINTEGROWANA/CF_EDIT_ALL_ZONES_API_TOKEN/CF_API_TOKEN ✅ (04:37 + 04:41) · SOPS secrets/monitoring.env.sops ✅ canary OK (branch) · PR #3354 · vps-i1 pending secrets-sync on PR #3354 merge
2026-07-08 — VERIFIED (no change needed)GH_TOKEN, OVH_APP_KEY, OVH_APP_SECRET, MYSQL_ROOT_PASSWORD (secrets/monitoring.env.sops)stub-population — PR #3322 (rc/fix-monitoring-sops-stubs) opened to populate 4 empty stubs conflicted with main. Investigation revealed all 4 keys already correctly populated in main (GH_TOKEN via PR #3213, OVH keys + MYSQL via earlier rotation work). Values verified by decryption + cross-comparison against source files (n8n-bms4.env.sops, ovh-api.env.sops, vps-i1 traccar/.env) — all 4 lengths and values match. PR #3322 closed as superseded. secrets-sync triggered to deploy current monitoring.env.sops to vps-i1.claude (secret-manager)SOPS secrets/monitoring.env.sops ✅ values correct (lengths: GH_TOKEN=93, OVH_APP_KEY=16, OVH_APP_SECRET=32, MYSQL_ROOT_PASSWORD=24) · PR #3322 closed · secrets-sync triggered
2026-07-08 03:50 UTC — PENDING secrets-sync (runner offline)V42_s3Bucket_api_accessKeyId, V42_s3Bucket_api_secretAccessKey (secrets/pinbox24-w4.env.sops + secrets/pinbox24-backends.env.sops)scheduled — W4 Wasabi S3 key rotation. Wasabi user: pinbox24-bms1-s3. Old key prefix T7QUMVQJ (active on bms-1). New key prefix 5F1BQ5KP created and stored in both SOPS files (canary OK). PR #3321 merged at 03:58 UTC. Auto-triggered secrets-sync run 28916386701 queued but NOT started — self-hosted runners went offline after 03:42 UTC (issue #3324). bms-1 v42-prod containers still healthy with old key. Old key T7QUMVQJ MUST NOT be deleted until deployment confirmed. Also fixes gap from #3244: pinbox24-backends.env.sops now matches live key. PENDING RUNNER RECOVERY: once issue #3324 resolved, run 28916386701 will deploy, then delete T7QUMVQJ from Wasabi IAM.claude (secret-manager)SOPS secrets/pinbox24-w4.env.sops ✅ canary OK · SOPS secrets/pinbox24-backends.env.sops ✅ canary OK · PR #3321 ✅ merged · secrets-sync run 28916386701 QUEUED (runners offline — issue #3324) · bms-1 deployment PENDING runner recovery · old key T7QUMVQJ DO NOT delete until confirmed
2026-07-08 03:20 UTC — BLOCKED (rotation) / COMPLETED (root cause)GH_TOKEN (secrets/n8n-bms4-gh.env.sops)exposure (#3286) — 3rd recurrence of the same pattern (prior: #2689 2026-07-03, #3155 2026-07-07). Routine git remote -v on bms-4’s /opt/p24-infra checkout printed the embedded x-access-token:<PAT>@github.com credential. Confirmed match via SHA-256 hash comparison (value never printed/logged) against GH_TOKEN/GITHUB_PAT_ALL_WRITES/GITHUB_PAT_P24_INFRA/N8N_BMS4_GH_TOKEN candidates — only GH_TOKEN matched. Confirmed still live via read-only gh api /user call using bms-4’s existing claude-runner auth (returned radieu). Root cause: secrets-sync.yml “Ship to bms-4” step unconditionally ran git remote set-url origin "https://x-access-token:${GH_PAT}@..." on every sync — the embedded-URL form was being recreated on every deploy, so each prior rotation just leaked the new token again. Rotation BLOCKED: PAT create + revoke are GitHub UI-only (2FA-gated, github.com/settings/tokens) — no API exists for either. No GITHUB_TOTP_SECRET found to unblock Playwright automation (Tier 2 prerequisite unmet per secret-rotation-access-matrix.md) → escalated to Tier 3 human action. Root cause FIXED: replaced embedded-URL remote with a git credential helper (/opt/p24-infra/bms-4/git-credential-gh-token.sh) that reads GH_TOKEN from the deployed env file at request time; applied live on bms-4 (verified via git fetch/git ls-remote, no test commits) and patched into secrets-sync.yml so it self-reinstalls on every future sync — this specific exposure vector cannot recur once the PR merges, independent of when the human completes the PAT rotation.claude (secret-manager)Root cause: git credential helper live on bms-4 ✅ · git remote -v confirmed clean (no credential) ✅ · git fetch/git ls-remote verified ✅ · PR #3304 (secrets-sync.yml fix) · UPDATE [re-verified queue #1692, 2026-07-08]: SOPS ROTATED (commit 2085e881; GH_TOKEN 93 chars, single github_pat_, sha256 d9224dcbdf5e, authenticates HTTP 200) ✅ · deployed env bms-4/n8n-bms4-gh.env matches SOPS (same sha256, HTTP 200) ✅ · leak vector closed (git remote -v token-free, git ls-remote origin OK) ✅ · STILL PENDING HUMAN (Tier 3): revoke the OLD exposed PAT at github.com/settings/tokens — rotation ≠ revocation; old value no longer on disk so worker cannot verify/revoke it · GH Secret GH_TOKEN (last set 2026-06-30, pre-rotation) ownership decision pending — NOT overwritten autonomously · vps-h1 identical embedded-URL anti-pattern split to #3372
2026-07-08 — PENDING secrets-syncLINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET, LINKEDIN_ACCESS_TOKEN, LINKEDIN_TOKEN_EXPIRES (secrets/n8n-bms4.env.sops)oauth-refresh (#3098) — LinkedIn OAuth flow completed: access token refreshed (new expiry 2026-09-06), client credentials populated (were empty placeholders). bms-4 /root/.env exposure resolved (issue #3098). All 4 keys updated in one sops-set.ps1 batch round-trip (canary OK). Source files wiped after SOPS write. Distribution: bms-4 via secrets-sync.yml. n8n workflows consuming LinkedIn creds (waha-router, LinkedIn post publisher) will pick up new token on container restart triggered by secrets-sync.claude (secret-manager)SOPS secrets/n8n-bms4.env.sops ✅ canary OK · PR pending · bms-4 pending secrets-sync on PR merge
2026-07-08 — COMPLETEDMAILGUN_MONGODB_URL, MAILGUN_AUTH_TOKEN, MAILGUN_S3_SERVER_URL, MAILGUN_S3_V2_SERVER_URL (secrets/pinbox24-backends.env.sops)bootstrap — Phase 0 from docs/plans/w3-w4-cicd-full-deployment.md. mailgun-prod container on bms-1 processes inbound Mailgun webhooks into MongoDB regRecords. Credentials sourced from /root/mailgun-prod/mailgun-environment.env on bms-1 (94.23.26.113). Keys renamed with MAILGUN_ prefix to avoid collision with other keys in pinbox24-backends.env.sops. Standard Windows SOPS pattern: decrypt→append in memory→WriteAllText (no BOM/CRLF)→encrypt temp→canary on temp→atomic move. Env lock acquired/released via p24_env_locks. PR #3276.claude (secret-manager)SOPS secrets/pinbox24-backends.env.sops ✅ canary OK · bms-1 distribution via secrets-sync.yml pending PR #3276 merge
2026-07-08 02:10 UTC — COMPLETEDWASABI_ACCESS_KEY, WASABI_SECRET_KEY, P24_INFRA_WASABI_ACCESS_KEY, P24_INFRA_WASABI_SECRET_KEY (secrets/monitoring.env.sops)fix (#3263) — wasabi-iam-rotator ran multiple times (2026-06-27, 2026-07-05 ×2) but wasabi-sops-update.yml failed each time (workflow dispatched to dev branch + path_regex mismatch on /tmp/ input file). Vercel staged key (HANSNA6Z prefix) was deleted by a later rotation run. p24-infra IAM user had 2 active keys (UBCLNW4Q 15:31, 3591W1EP 16:25 — both 2026-07-05); neither matched Vercel relay. SOPS held original pre-rotation key (CD1Z prefix). Deleted UBCLNW4Q (older), created fresh key (OMG1CNJB prefix). Vercel relay updated. SOPS updated via decrypt→patch→WriteAllText→encrypt→canary. WASABI_ADMIN keys in administration.env.sops VALID (IAM ListUsers succeeded — prefix 7H5P) — no admin key update needed.claude (secret-manager)Wasabi IAM old key deleted ✅ · new key OMG1CNJB prefix active ✅ · Vercel relay updated ✅ · SOPS secrets/monitoring.env.sops ✅ canary OK · PR #3273 ✅ merged · secrets-sync run 28911971396 ✅ success · vps-i1 monitoring.env + thanos/s3.yml deployed ✅ · docker compose restarted ✅
2026-07-08 01:36 UTC — PENDING secrets-syncCLOUDFLARE_TOKEN_ZINTEGROWANA (secrets/monitoring.env.sops)preventive — scheduled rotation. New token zintegrowana-dns-2026-07-08-v3 (ID: 4c70812953a7d4e6ba881e4f8b083b96) created via CF API with Zone DNS Write permission on zone 57cb3d8f24c7cc319fb703394edc7b87 (zintegrowana.online). SOPS updated + GH Secret set. Consumers: CF DNS automation workflows triggered from vps-i1. Stale tokens to delete after PR merge: zintegrowana-dns-2026-07-08 (ID: 0f02833c875c785a8ea5625865d88279), zintegrowana-dns-2026-07-08-local (ID: 4c3716a92e82d2e2ab522494a1b30918), zintegrowana-dns-2026-07-06 (ID: 345919166e6234d7f932eeb1f510c23b). PR #3267.claude (secret-manager)SOPS secrets/monitoring.env.sops ✅ canary OK · GH Secret CLOUDFLARE_TOKEN_ZINTEGROWANA ✅ · vps-i1 pending secrets-sync on PR #3267 merge
2026-07-08 01:36 UTC — PENDING secrets-syncCF_EDIT_ALL_ZONES_API_TOKEN (secrets/monitoring.env.sops)preventive — scheduled rotation. New token all-zones-edit-2026-07-08-v3 (ID: fd3824ce40cae6ce85ba501b3eaaffff) created via CF API. SOPS updated + GH Secret set. Consumers: credential-rotation.yml workflow (CF token roller). Stale tokens to delete after PR merge: all-zones-edit-2026-07-08 (ID: b28dd2a908e2917376d0d4ad9c6a282d), all-zones-edit-2026-07-08-local (ID: 3bae2447803877f56d52a3c12533e8b2). PR #3267.claude (secret-manager)SOPS secrets/monitoring.env.sops ✅ canary OK · GH Secret CF_EDIT_ALL_ZONES_API_TOKEN ✅ · vps-i1 pending secrets-sync on PR #3267 merge
2026-07-08 — ESCALATEDCF_API_TOKEN (secrets/monitoring.env.sops)preventive/escalated — Tier 3 token (holds User:API Tokens:Edit scope, cannot self-rotate without that scope). CF API returned 403 with Bearer auth (scoped token lacks User scope). Escalated to human. GH issue #3268 created with rotation steps. HUMAN ACTION REQUIRED: create new token at dash.cloudflare.com/profile/api-tokens, then a secret-manager agent updates SOPS + GH Secret.claude (secret-manager)SOPS NOT updated (blocked Tier 3) · **pending human — issue 3268
2026-07-08 00:48 UTC — AUDITV42_s3Bucket_api_accessKeyId (bms-1 deploy scripts + secrets/pinbox24-backends.env.sops)audit — #3244: 7N4sbbrB deploy script had 5NUMVNCWLXW0T573S7ZF hardcoded; glrt-HOR had VCUC7X6A1GINU54MDWON. Containers s3-v42-prod + v42-prod now running T7QUMVQJWJVHIRRKICW9 (updated by #3216 via SSH backend-environment.env patch). s3-v2-v42-prod pinbox24PublicAccessKeyId=LT9WM7ZB8WFNC1BT1K1V matches SOPS. Gaps: deploy scripts NOT patched → #3244; pinbox24-backends.env.sops stale 5NUMVNCWLXW0T573S7ZF → #3244; WASABI_ADMIN_ACCESS_KEY InvalidAccessKeyId → cannot verify if 5NUMVNCWLXW0T573S7ZF deleted from Wasabi IAM → human-action #3243.claude (secret-manager)containers ✅ (via #3216) · deploy scripts — #3244 · backends.env.sops — #3244 · Wasabi IAM key status UNKNOWN → #3243
2026-07-08 ~15:00 UTC — COMPLETEDMONGODB_RS0_ADMIN_PASSWORD (secrets/administration.env.sops, secrets/bms-servers.env.sops, secrets/mongodb-bms.env.sops)security (#3215) — second exposure event (admin password substring appeared in SOPS filter output). Maintenance window rotation. New 64-char CSPRNG hex password. Changed via db.getSiblingDB('admin').changeUserPassword('admin', ...) on bms-2 (rs0 PRIMARY, ismaster=true verified). All 3 SOPS files updated (canary OK, 64-char value verified). GH Secret updated. Pinbox24 w3/w4 unaffected (use dedicated w3_app/w4_app users). prometheus user unaffected (separate key in n8n-bms4.env.sops).claude (secret-manager)SOPS secrets/administration.env.sops ✅ canary OK · SOPS secrets/bms-servers.env.sops ✅ canary OK · SOPS secrets/mongodb-bms.env.sops ✅ canary OK · GH Secret MONGODB_RS0_ADMIN_PASSWORD ✅ · bms-2 new auth verified ✅ · PR #3239 · pending secrets-sync on merge
2026-07-08 — COMPLETEDMONGO_W4_URI, MONGO_W3_URI (secrets/pinbox24-backends.env.sops)bootstrap — added two new URI alias keys for bms-1 consumers. MONGO_W4_URI sourced from V42_NEW_MONGODB_URI (w4_db on bms-2), MONGO_W3_URI sourced from V32_MONGODB_URL (w3_db on bms-2). Both verified to point to bms-2 (145.239.133.104) via boolean regex before write. Safe Windows SOPS pattern: decrypt→append in memory→WriteAllText→encrypt temp→canary on temp→atomic move.claude (secret-manager)SOPS secrets/pinbox24-backends.env.sops ✅ canary OK · bms-1 pending secrets-sync.yml on PR #3238 merge
2026-07-08 02:10 UTC — PENDING secrets-syncV42_MAILGUN_API_KEY (secrets/pinbox24-w4.env.sops)scheduled (#3216) — Tier 3 dashboard-only key. Mailgun V1/V3 API returns HTTP 400 on POST /keys — no programmatic rotation available. GH issue #3225 created (human-action, security labels). Old key prefix: key-f96d. Claude session confirmed Mailgun admin key is valid (HTTP 200 on domain list). Blocker: human must create new key in Mailgun EU dashboard.claude (secret-manager)BLOCKED — **human-action issue 3225 · SOPS NOT updated yet
2026-07-08 02:00 UTC — COMPLETEDV42_s3Bucket_api_accessKeyId, V42_s3Bucket_api_secretAccessKey (secrets/pinbox24-w4.env.sops)scheduled (#3216) — W4 Wasabi IAM key rotation. Wasabi user is pinbox24-bms1-s3 (fixed from wrong pinbox24-w4 in rotation script). Old key LT9WM7ZB prefix deleted. Stale key B7MWHC7N already absent in Wasabi. New key T7QUMVQJ prefix active. SOPS updated (decrypt→patch→WriteAllText→encrypt→canary). Also fixed scripts/sops-reset-pinbox24.ps1 lines 177+198: pinbox24-w4pinbox24-bms1-s3. W3 investigation: V32 s3-environment.env uses IAM user p24-access (key prefix NLDXB0RB) — SOPS has empty creds (gap, not a rotation needed yet). PR #3227 pending merge.claude (secret-manager)SOPS secrets/pinbox24-w4.env.sops ✅ canary OK · Wasabi old key deleted ✅ · secrets-sync ✅ run #28906953781 success · v42-prod restarted ✅ (up 10 min) · API https://api.w4.pinbox24.com HTTP 200 ✅ · PR #3227 pending merge
2026-07-08 — COMPLETEDATRAX_AUTH_STRING, ATRAX_SCOPE, ATRAX_WEBAPP_INSTANCE_ID (secrets/n8n-bms4.env.sops)credential-sync (#3178 PR-B Track B) — 3 ATRAX keys missing from n8n-bms4.env.sops (only ATRAX_CLIENT_ID/SECRET/USERNAME/PASSWORD present). Keys copied from monitoring.env.sops. Keys remain in monitoring until PR-G shrink phase.claude (secret-manager)SOPS secrets/n8n-bms4.env.sops ✅ canary OK · PR #3223 · no server deploy needed (sync-bms-4 update in PR-D)
2026-07-08 — COMPLETEDV42_v3MongoUrl (secrets/pinbox24-backends.env.sops)credential-sync (#3186) — key pointed to decommissioned artnet.pl MongoDB cluster. bms-1 backend-environment.env was already manually patched (live server correct). SOPS file updated to match live server (bms-2, 145.239.133.104, replicaSet=rs0). V42_NEW_MONGODB_URI was already correct. No container restart needed (v42-prod not running).claude (secret-manager)SOPS secrets/pinbox24-backends.env.sops ✅ canary OK · bms-1 live env already correct · PR #3214
2026-07-08 — COMPLETEDGH_TOKEN (secrets/monitoring.env.sops)rotation (#3155) — fine-grained PAT p24-infra-automation-2026 (created 2026-06-27, expires 2026-09-25) rotated proactively to p24-infra-automation-2026-v2 (93 chars). Previous PR #3158 had a merge conflict (rc branch had new GH_TOKEN; main already had new CF_EDIT_ALL_ZONES_API_TOKEN from PR #3177). Resolved by creating a fresh conflict-free branch rc/rotate-gh-token-final from main, extracting new GH_TOKEN from rc branch worktree, and re-encrypting monitoring.env.sops with both new tokens.claude (secret-manager)SOPS secrets/monitoring.env.sops ✅ canary OK · vps-i1 pending secrets-sync on PR merge · PR #3158 closed (superseded) · PENDING HUMAN: revoke old PAT p24-infra-automation-2026 at github.com/settings/personal-access-tokens
2026-07-08 00:30 UTC — COMPLETEDmongodb_w4_app_password (secrets/bms-servers.env.sops) + V42_NEW_MONGODB_URI (secrets/pinbox24-w4.env.sops) + NEW_MONGODB_URI (bms-1:/root/builds/7N4sbbrB/0/pinbox24/p24-back-ts/backend-environment.env)security — exposure incident: mongodb_w4_app_password value appeared in Claude session output 2026-07-07. Rotation was initially BLOCKED by stale admin credentials; unblocked after MONGODB_RS0_ADMIN_PASSWORD was recovered (see entry below). Final rotation: new 40-char hex password generated via CSPRNG, w4_app user password changed in MongoDB on bms-2 (PRIMARY, rs0) via mongosh, all SOPS files updated (canary OK), bms-1 backend-environment.env patched via base64-encoded Python, v42-prod container restarted with --force-recreate, API verified HTTP 200. Issues: #3187 (exposure), #3199 (admin blocked).claude (secret-manager)SOPS secrets/bms-servers.env.sops ✅ canary OK · SOPS secrets/pinbox24-w4.env.sops ✅ canary OK · bms-1 backend-environment.env ✅ · v42-prod restarted ✅ · api.w4.pinbox24.com/api/i18n/langs HTTP 200 ✅ · PR #3200
2026-07-08 00:00 UTC — COMPLETEDMONGODB_RS0_ADMIN_PASSWORD (secrets/administration.env.sops, secrets/bms-servers.env.sops, secrets/mongodb-bms.env.sops)sync — all three SOPS files held a stale 48-char admin password that failed db.auth() on bms-2 and bms-3. Recovery source: v3MongoUrl key in bms-1 /root/builds/7N4sbbrB/0/pinbox24/p24-back-ts/backend-environment.env — admin credentials were embedded there since commit 80baf118. Confirmed working by monitoring MongoDB auth logs (auth successes from bms-1 IP 94.23.26.113). All three SOPS files updated with recovered value (same password, no generation needed). Canary decrypt OK on all three. Issue: #3199.claude (secret-manager)SOPS secrets/administration.env.sops ✅ canary OK · SOPS secrets/bms-servers.env.sops ✅ canary OK · SOPS secrets/mongodb-bms.env.sops ✅ canary OK · PR #3200
2026-07-08 07:35 UTCMAILGUN_AUTH_TOKEN (secrets/pinbox24-backends.env.sops)ADD — new key, not a rotation. mailgun-v42-prod incident: MONGODB_URL/S3_V2_SERVER_URL/AUTH_TOKEN all empty or missing in mailgun-environment.env, breaking rechnung-AI@ pipeline end-to-end. AUTH_TOKEN is the static “integration” type token hardcoded in v42-prod’s automatedRequest.const.js — copied into SOPS so secrets-sync.yml can deploy it consistently instead of it living only inside v42-prod’s compiled source.claudeSOPS commit pending PR; new secrets-sync.yml step “Sync mailgun-environment.env keys” deploys MONGODB_URL (built fresh from mongodb_rs0_admin_password every run), S3_V2_SERVER_URL (static, not secret), and AUTH_TOKEN to mailgun-environment.env on bms-1
2026-07-08 06:00 UTC#2701CF_EDIT_ALL_ZONES_API_TOKEN, CLOUDFLARE_TOKEN_ZINTEGROWANA (secrets/monitoring.env.sops)incident — #2620 monitoring.env.sops exposure follow-up (Tier 1)claude (secret-manager worker, bms-4) via credential-rotation.yml run 28919650189 (Global Key)
2026-07-08 06:00 UTC#2701CLOUDFLARE_TOKEN_ZINTEGROWANA (Cloudflare)ORPHAN cleanup needed — run 28919650189 minted a SECOND active ZINTEGROWANA token (in closed PR #3367) that is deployed nowhere; main uses a different active token.flag only