Skip to content

Incident 2026-08-25: helm apply with public values half wiped the GitHub App identity from both prod ConfigMaps — GitSync + registry pulls down ~15 min #2210

Description

@rbuergi

Impact

2026-08-25 ~11:13–11:30 UTC, both prod portals (memex.systemorph.com and memex.meshweaver.cloud): every GitHub sync failed with "Connect your GitHub account first … or configure the GitHub App identity". Because memex-cloud is the plugin registry and its GitHub App credential is what pulls Systemorph/MeshWeaver.Plugins@main, this also stalled catalog auto-updates and the in-flight _App migration. Restored at ~11:24Z; both portals verified (git_hub_sync op=check space=Store → "Branch 'main' is at b8f3523a", Succeeded).

Root cause

The GitHub App identity lived only as live drift on the ConfigMap, and a helm apply rendered from the public values half clobbered it.

  • GitHub__App__{ClientId,InstallationId,InstallationOwner} were never in any values source: I decoded the last-good helm release secrets (sh.helm.release.v1.memex.v17, sh.helm.release.v1.memexcloud.v3) and their rendered memex-portal-config has all three empty — the chart templates them as default "". The real values had been kubectl patched onto the live ConfigMap (2026-07-09, the GitSync-as-App rollout) and survived every apply since only because those applies didn't touch the keys.
  • At 10:54:08Z (ns memex, helm rev v18) and 11:06:06Z (ns memex-cloud, rev v4) — four minutes after helm: render OpenRouter__Models — twelve declared keys reached no container #2203 ("render OpenRouter__Models") merged — helm upgrades were applied with the public halves only. The CM re-render emptied the three keys; the failure began when the new ReplicaSets came Ready (~11:13Z).
  • The applier is unidentified (no session claimed it at the time of writing); the mechanism does not depend on who — any apply without the identity in a values source reproduces it.
  • Not related to RCA #2194: stale-build retention docs + fleet-wide Modules:AutoRecycleOnStaleBuild opt-in #2197's enablement earlier this morning: that was a single-key kubectl patch --type merge (cannot remove keys), and sync still worked at 11:04Z, after its rollout.

Remediation (done)

Three-key merge patch restored in both namespaces (values confirmed from two independent sources: the 2026-07-09 rollout record, and gh api /orgs/Systemorph/installations → installation 144517285, app meshweaver-cloud, app_id 4220566) + rolling restart; newest pods' env verified; sync check green on both portals. Full-CM diff against both last-good renders: zero other chart-managed keys were emptied — the GitHub App trio was the complete loss set. The PEM half (KV github-app-privatekey → SPC → Secret) was never affected.

Durable fixes

  1. The identity enters the per-env values source (config half, beside the public per-env values) so any future render carries it — a live-drift-only value is one apply away from deletion, permanently. (Applied on the operator machine's per-env values; see below.)
  2. Pre-apply guard: the sanctioned apply path must diff the rendered memex-portal-config against the LIVE ConfigMap and refuse when the render empties a key that is non-empty live (override flag for intentional removals). A chart whose defaults are "" makes "the private half was missing from this render" indistinguishable from "this key was never set" — the guard is what makes that loud. This is the same invariant class as the existing check-chart-drift.sh, but enforced before the write instead of observed after.
  3. Standing rule already in AGENTS/runbook, re-affirmed: deploy.sh/full-chart applies are env-setup, not the code/config-update path; a config fix ships as a values change + targeted apply with the guard, never a public-halves-only helm upgrade.

Cross-refs: #2194 (this morning's unrelated stale-build outage — same day, different mechanism), #2203 (the chart change whose deploy carried the bad render), 2026-07-09 GitSync-as-App rollout (where the drift was introduced).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions