Skip to content

Self-updater never opens a Roll for newer promoted builds — build portal 7 d stale and feature-degraded, client-b 4 d stale #6501

Closed

Description

@rbuergi

(re-filed 2026-10-11; replaces a deleted issue, formerly number 5757; originally by systemorph-com[bot] on 2026-09-26)

What is failing. FleetWatch's StalePortal roll alarm fired for two fleet instances: build is still running 3.0.0-ci.8411 while 3.0.0-ci.9406 is the newest promoted build (a compatible newer build was first promoted 7 d 11 h ago), and client-b is on 3.0.0-ci.9077 (4 d 2 h behind). In both cases the blocking reason recorded is the same: no self-update Roll was opened by the instance's self-updater for any build newer than the one it runs — the updater has not announced one. On build the alarm additionally carries pending_module_activation: Degraded — 35 modules (the whole MeshWeaver.AI.* family, MeshWeaver.Azure.Blob, …) are landed but not loaded in the running process, plus 1 module REFUSED, so the instance is also feature-degraded until a restart.

The alarm itself is working as designed (FleetWatch — "roll, restart, observe"); the defect is that the self-update loop that should have rolled these portals never announced a Roll.

Probable cause. The self-updater on the affected instances has stopped opening Roll announcements for newer compatible builds. Confidence: medium — the alarm text names the ground ("its self-updater has not announced one"), but the evidence does not distinguish between a stuck self-updater process, an Admin/UpdatePolicy blocked by merge-guard/update-queue failures (the log history around Admin/UpdatePolicy shows repeated UpdateQueue FAILED / MergeGuard refused / could not record the check verdict entries on the memex-cloud pod in the days before), or a deliberately conservative policy. A secondary symptom on build — 35 landed-but-unloaded modules needing a restart — is consistent with a long-lived process that has not restarted in a week, which a working roll cadence (bound: two CD cycles = 6 h) would have forced.

Impact. Both portals are still serving (no outage), but build has been running a 7-day-old build and is feature-degraded (AI modules landed but not active). 2 occurrences on one observing pod, first seen 2026-09-26T12:22Z; the underlying staleness itself goes back to 2026-09-19 (build) and 2026-09-22 (client-b). The CD roll guarantee — a portal no more than ~6 h behind the newest promoted build — is broken for two of the fleet's instances.

Where to look. Start with the self-updater on the affected instances: read each instance's Admin/UpdatePolicy and its self-update log as the alarm instructs, and check the UpdateQueue/MergeGuard/SelfUpdate log categories (repeated FAILED path=Admin/UpdatePolicy lines and stale/reordered cross-hub write refusals appear in Ops/Logs in the preceding days — see the memex-cloud pod entries). Also check whether the refused module on build blocks activation. Related prior work: MeshWeaver#4471 (self-update configuration lambda never ran), #5011, #5384.


Evidence

Fingerprint 24851d544b6ccf02
Category FleetWatch
Severity Error
Namespace memex
Pods memex-portal-deployment-54bf7d958b-8n7r4
Occurrences 2
First seen 2026-09-26 12:22:54Z
Last seen 2026-09-26 12:22:54Z
Routing not determined — no configured route matches the category FleetWatch. This repository is the configured fallback, not a finding about who owns the fault; the category names the LOGGER, which may not be the subject.
Recent log lines
2026-09-26 12:22:54Z memex-portal-deployment-54bf7d958b-8n7r4 fail: FleetWatch[0]
      [FleetWatch] roll alarm StalePortal on build: build: Stale portal — still on 3.0.0-ci.8411, newest promoted is 3.0.0-ci.9406. build runs 3.0.0-ci.8411. A newer compatible build was first promoted 2026-09-19 00:28:21Z (7 d 11 h ago); the newest is 3.0.0-ci.9406. Bound: two CD cycles = 6 h 0 m (startup probe 10800 s × 1 replica(s) = 3 h 0 m per roll). Blocking: no self-update Roll was opened for build for any build newer than 3.0.0-ci.8411 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) · the portal reports pending_module_activation: Degraded — 35 module(s) are landed but not yet loaded in this process — a restart activates them: MeshWeaver.AI, MeshWeaver.AI.Anthropic, MeshWeaver.AI.AppleIntelligence, MeshWeaver.AI.AzureFoundry, MeshWeaver.AI.ClaudeCode, MeshWeaver.AI.Codex, MeshWeaver.AI.Copilot, MeshWeaver.AI.OpenAI, MeshWeaver.AI.WebSearch, MeshWeaver.Azure.Blob, …(+25); 1 module(s) were REFUSED a… Observed running 3.0.0-ci.8411; expected a build no more than 6 h 0 m behind the newest promoted.
2026-09-26 12:22:54Z memex-portal-deployment-54bf7d958b-8n7r4 fail: FleetWatch[0]
      [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on 3.0.0-ci.9077, newest promoted is 3.0.0-ci.9406. client-b runs 3.0.0-ci.9077. A newer compatible build was first promoted 2026-09-22 10:12:01Z (4 d 2 h ago); the newest is 3.0.0-ci.9406. Bound: two CD cycles = 6 h 0 m (startup probe 10800 s × 1 replica(s) = 3 h 0 m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than 3.0.0-ci.9077 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9077; expected a build no more than 6 h 0 m behind the newest promoted.

Opened automatically from Admin/_LogIncident/24851d544b6ccf02. Recurrences are folded into this issue rather than opening new ones.
It also stands for the whole log site b164c7a435ab60de: other fingerprints of this site fold in here as comments rather than opening tickets of their own.

Activity

  1. added
    bugSomething isn't working
    sev:MMedium - secondary path broken, or easy workaround
    on Oct 11, 2026
  2. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-26)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 401e97dd2d279572
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalenessUnobserved on build: build: Staleness not observable — the fleet watch cannot tell whether this portal is current. No self-update Roll in the fleet's action history carries a tag matching pattern {n}.{n}-ci* — whether {n}.{n}-ci.{n} is current is UNKNOWN. This is '{value}', reported as loudly as a fault: nothing here says the roll or the build is fine. Observed no promoted build matching pattern {n}.{n}-ci* is recorded; expected a judgeable observation.
    Namespace memex-cloud
    Pods memex-portal-deployment-6d84f5d754-xkfk4
    Occurrences 2
    First seen 2026-09-26 15:51:40Z
    Last seen 2026-09-26 15:51:46Z
    Already folded here 2 fingerprint(s)
    Incident Admin/_LogIncident/401e97dd2d279572
    What triage wrote about this fingerprint

    What is failing

    The FleetWatch staleness watch on the memex-portal pod cannot determine whether the running portal build is current, and reports this as a fail-level roll alarm (StalenessUnobserved). The watch looks for a self-update Roll entry in the fleet's action history whose tag matches the CI pattern 3.0.0-ci*; none exists, so it cannot judge whether builds 3.0.0-ci.8411 / 3.0.0-ci.9408 are current and alarms loudly instead.

    Probable cause

    The portal pod was evidently not deployed through the self-update Roll flow — or its action history was not (yet) recorded — so there is no Roll entry carrying a 3.0.0-ci.* tag for the watch to compare against. The watch treats "no judgeable observation" as a fault-level alarm rather than distinguishing "not deployed via Roll" from "stale". Confidence: moderate — the message itself is explicit about the missing evidence, but I could not locate the FleetWatch source in the readable mesh partitions to confirm whether the pod is expected to carry Roll history at all.

    Impact

    Minimal so far: 2 occurrences within 6 seconds on a single pod (memex-portal-deployment-6d84f5d754-xkfk4). No user-facing failure is evidenced; the harm is noisy fault-level alarms and a blind spot in staleness monitoring for this pod.

    Where to look

    The FleetWatch staleness watch (log category FleetWatch): the code path that scans the fleet's action history for a self-update Roll with a tag matching {major}.{minor}-ci* and emits StalenessUnobserved when none is found. Two candidate fixes: have the watch classify "no Roll history" as a distinct, lower-severity state, or ensure portal pods record a self-update Roll on deployment. Note: no existing incident covering FleetWatch/StalenessUnobserved was found, so this appears to be new.

    Still occurring: 2 more since the last update (2 total).

    • Last seen: 2026-09-26 15:51:46Z
    • Pods: memex-portal-deployment-6d84f5d754-xkfk4
    Recent log lines
    2026-09-26 15:51:40Z memex-portal-deployment-6d84f5d754-xkfk4 fail: FleetWatch[0]
          [FleetWatch] roll alarm StalenessUnobserved on build: build: Staleness not observable — the fleet watch cannot tell whether this portal is current. No self-update Roll in the fleet's action history carries a tag matching pattern 3.0.0-ci* — whether 3.0.0-ci.8411 is current is UNKNOWN. This is "I could not check", reported as loudly as a fault: nothing here says the roll or the build is fine. Observed no promoted build matching pattern 3.0.0-ci* is recorded; expected a judgeable observation.
    2026-09-26 15:51:46Z memex-portal-deployment-6d84f5d754-xkfk4 fail: FleetWatch[0]
          [FleetWatch] roll alarm StalenessUnobserved on memex: memex: Staleness not observable — the fleet watch cannot tell whether this portal is current. No self-update Roll in the fleet's action history carries a tag matching pattern 3.0.0-ci* — whether 3.0.0-ci.9408 is current is UNKNOWN. This is "I could not check", reported as loudly as a fault: nothing here says the roll or the build is fine. Observed no promoted build matching pattern 3.0.0-ci* is recorded; expected a judgeable observation.
    
  3. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-26)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 3da53af1c4ad320c
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail `[FleetWatch] roll alarm StuckRoll on memex: memex: Stuck roll — {n}.{n}-ci.{n} is not taking over from {n}.{n}-ci.{n}. Deployment memex-portal-deployment in namespace memex: its template (ReplicaSet memex-portal-deployment-{n}f4{n}b9{n}cf) runs {path}:{n}.{n}-ci.{n}, while {n} ready pod(s) serve {path}:{n}.{n}-ci.{n}. New pod memex-portal-deployment-{n}f4{n}b9{n}cf-s5h9{n} is not Ready {n} m after it started — past its startup budget of {n} m. Roll in flight since {time}; budget startup probe {n} s × {n} replica(s) = {n} m per roll. Pod memex-portal-deployment-{n}f4{n}b9{n}cf-s5h9{n}: phase Running, {n} restart(s), started {time}; readiness: timing: {n}ms total over {n} check(s), slowest first — pending_module_activation {n}ms; data_volume_free_space {n}ms; {n} more under {n}ms
    Namespace memex
    Pods memex-portal-deployment-6f45b975cf-85qc6
    Occurrences 1
    First seen 2026-09-26 15:56:16Z
    Last seen 2026-09-26 15:56:16Z
    Already folded here 4 fingerprint(s)
    Incident Admin/_LogIncident/3da53af1c4ad320c
    Triage called it FleetWatch StuckRoll fires on a same-image roll whose new pod is still inside the chart's bake-gated progress deadline
    What triage wrote about this fingerprint

    Likely duplicate of Systemorph/MeshWeaver.Plugins#2411. That issue predicted this false positive from reading the code; this incident looks like the first time it happened in production. A human can probably close this one as a duplicate and link the evidence below to #2411.

    What is failing

    The fleet watch's stuck-roll alarm (RollAlarms.StuckRoll) raised a Critical StuckRoll on memex for a roll that the evidence says was still progressing normally:

    • The alarm fired on the per-pod trigger "new pod is not Ready 10 m after it started — past its startup budget of 10 m".
    • One of the two new pods was already Ready.
    • The late pod was Running with 0 restarts. Its readiness checks were fast (24 ms total, slowest pending_module_activation), and it reported a bake in progress (bake-report: Degraded … compiling sweep).
    • The roll had been in flight for about 20 minutes. The alarm's own roll budget for this deployment is 30 minutes.

    Probable cause (medium–high confidence)

    RollAlarms.Budget judges a not-Ready pod against the startup-probe budget alone (periodSeconds × failureThreshold, 600 s on memex). Since MeshWeaver#5544 the NodeType bake runs on readiness, not startup. The chart pays for that bake in progressDeadlineSeconds (startup budget + 600 + probes.rollGate.bakeSeconds 1800), as #2411 describes. So a pod that has started but is still baking is legitimately not Ready for up to about 50 minutes, and the alarm calls it stuck after 10. The class doc comment says the alarm uses "the same formula" as InstanceActionPlan.RequestedRolloutSeconds. After Plugins#2407 that is no longer true.

    Not established: whether the pod memex-portal-deployment-6f45b975cf-s5h96 became Ready later. If it never did, this was a real stall and the bake is what to investigate, not the alarm. Check the pod's later readiness before closing.

    Secondary wording defect. The title reads "Stuck roll — 3.0.0-ci.9408 is not taking over from 3.0.0-ci.9408". The old and new ReplicaSets run the same image, so this was a restart-style roll (a template change without a new tag). The alarm words it as a version takeover. When the tags are equal it should say the new generation is not taking over from the old one, and name the ReplicaSets instead of the tag.

    Impact

    One occurrence on one instance (memex, the control instance). No user-facing failure is shown. The cost is a false Critical alarm, and its text tells operators "the remedy is the cause the pod names". That can send someone to investigate a healthy roll, and it teaches operators to ignore StuckRoll, which exists because a real three-day stuck roll went unnoticed. Every bake-gated roll on any instance whose bake takes longer than its startup budget will fire the same alarm, so this will recur.

    Where to look

    • Hosting/Issue/Source/RollAlarms:
      • Budget.Startup and Budget.Roll, and RecordFactsOf (the budget is read only from startupProbe).
      • StuckRoll: the lateStart trigger (now - StartedAt > budget.Startup) and the headline built from TagOf(template) / servingTag.
    • The fix direction in HOTFIX: main is red — restore the using MeshOperations needs #2411: size the not-Ready trigger and the roll budget from the chart's progress deadline (InstanceActionPlan.ProgressDeadlineSeconds), and keep a separate, tighter signal for a pod that is crash-looping or has not started at all.
    • RollAlarmsTests (TheBudget_IsTheRecordsOwn, EachTrigger_FiresOnItsOwn) pin the current numbers and will need updating.
    • Related: rbuergi/Feedback/rollalarms-startup-only-budget-20260926, Plugins#2403, Plugins#2407.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-26 15:56:16Z
    • Pods: memex-portal-deployment-6f45b975cf-85qc6
    Recent log lines
    2026-09-26 15:56:16Z memex-portal-deployment-6f45b975cf-85qc6 fail: FleetWatch[0]
          [FleetWatch] roll alarm StuckRoll on memex: memex: Stuck roll — 3.0.0-ci.9408 is not taking over from 3.0.0-ci.9408. Deployment memex-portal-deployment in namespace memex: its template (ReplicaSet memex-portal-deployment-6f45b975cf) runs meshweaver.azurecr.io/memex-portal-ai:3.0.0-ci.9408, while 2 ready pod(s) serve meshweaver.azurecr.io/memex-portal-ai:3.0.0-ci.9408. New pod memex-portal-deployment-6f45b975cf-s5h96 is not Ready 10 m after it started — past its startup budget of 10 m. Roll in flight since 2026-09-26 15:36:04Z; budget startup probe 600 s × 3 replica(s) = 30 m per roll. Pod memex-portal-deployment-6f45b975cf-s5h96: phase Running, 0 restart(s), started 2026-09-26 15:44:41Z; readiness: timing: 24ms total over 18 check(s), slowest first — pending_module_activation 20ms; data_volume_free_space 11ms; 16 more under 10ms | bake-report: Degraded — the NodeType enumeration snapshot PREDATED this replica's own prebuilt adoptions for 116 of 234 type(s), which were therefore classified from the record this process wrote rather than from the snapshot (#3703). compiling sweep at 2026-09-26T…. A Roll action that reported Done has only SET the image — this is what the cluster did with it. The remedy is the cause the pod names, not another roll and not a pin. Observed template 3.0.0-ci.9408 — 1/2 new pod(s) Ready; serving 3.0.0-ci.9408; expected every desired replica on 3.0.0-ci.9408 within 30 m.
    
  4. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-26)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 3f099caacdba2bf4
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail `[FleetWatch] roll alarm StuckRoll on memex: memex: Stuck roll — {n}.{n}-ci.{n} is not taking over from {n}.{n}-ci.{n}. Deployment memex-portal-deployment in namespace memex: its template (ReplicaSet memex-portal-deployment-{n}f7{n}bdd7) runs {path}:{n}.{n}-ci.{n}, while {n} ready pod(s) serve {path}:{n}.{n}-ci.{n}. New pod memex-portal-deployment-{n}f7{n}bdd7-qvqf7 is not Ready {n} m after it started — past its startup budget of {n} m. Roll in flight since {time}; budget startup probe {n} s × {n} replica(s) = {n} m per roll. Pod memex-portal-deployment-{n}f7{n}bdd7-qvqf7: phase Running, {n} restart(s), started {time}; readiness: timing: {n}ms total over {n} check(s), slowest first — db_version {n}ms; PostgreSql {n}ms; pending_module_activation {n}ms; data_volume_free_space {n}ms; {n} more under {n}ms
    Namespace memex
    Pods memex-portal-deployment-6f45b975cf-d7ggf
    Occurrences 1
    First seen 2026-09-26 17:29:49Z
    Last seen 2026-09-26 17:29:49Z
    Already folded here 5 fingerprint(s)
    Incident Admin/_LogIncident/3f099caacdba2bf4
    Triage called it memex-portal-ai 3.0.0-ci.9413 pod never becomes Ready: a dynamic NodeType's CLR type is not registered, stalling the roll on ci.9408
    What triage wrote about this fingerprint

    What is failing

    The self-update roll of the memex control instance from 3.0.0-ci.9408 to 3.0.0-ci.9413 is stalled: the new portal pod (ReplicaSet memex-portal-deployment-85f748bdd7) stays phase Running for its whole startup budget without ever becoming Ready, so the ready pods keep serving ci.9408 and no later build can roll. The pod is not crash-looping (0 restarts) and its health checks are fast — the only degraded finding is content-types: one NodeType whose CLR type is not registered in the process, so its pages would render empty.

    Probable cause

    High confidence that readiness fails on the content-types finding: the pod is Running, has zero restarts, every timed check completes in under 100 ms, and the sole non-healthy entry is the unregistered CLR type — there is nothing else for the readiness gate to fail on. The underlying defect sits in build 3.0.0-ci.9413 of memex-portal-ai: it carries, or its mesh content references, a dynamic NodeType whose backing CLR type is not registered in the portal process — most likely a module the image does not load, or node content that landed before the assembly that types it. Exactly which type and module needs to be identified from the 9413 build.

    Note the fleet-watch alarm itself is working as designed — Hosting/Issue/Source/RollAlarms raised exactly what it should, and the Roll action reporting Done after only setting the image is the documented behaviour. The defect is in what was rolled, not in the watcher.

    Impact

    Judged from the numbers: one roll, one pod, first occurrence minutes into the roll and still inside the 30 m whole-roll budget. Serving traffic is unaffected (the old pods answer). But the control instance's update lane is blocked — this is the lane whose stuck actions previously held memex 149 commits behind for 30 h (see rbuergi/Feedback/stuck-roll-recurred-20260926T1216Z, a different defect in the same symptom class, fixed by MeshWeaver.Plugins#2407). And if the new pod ever served, pages of the affected NodeType would render empty — silently wrong results.

    Where to look

    • The 9413 build: what it packages vs. what the mesh expects — build-server output for memex-portal-ai:3.0.0-ci.9413, against the module inventory Ops/Modules/memex.
    • The roll action Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9413-e6a68743 and the deployment record Deployments/memex.
    • The portal-side readiness gate that turns content-types: Degraded into NotReady — the alarm side is Hosting/Issue/Source/RollAlarms; the health check in the portal process is the seam to instrument.

    Not a duplicate of the stuck-observer feedback above (that was a lost action observer); this is the rolled build failing its own readiness.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-26 17:29:49Z
    • Pods: memex-portal-deployment-6f45b975cf-d7ggf
    Recent log lines
    2026-09-26 17:29:49Z memex-portal-deployment-6f45b975cf-d7ggf fail: FleetWatch[0]
          [FleetWatch] roll alarm StuckRoll on memex: memex: Stuck roll — 3.0.0-ci.9413 is not taking over from 3.0.0-ci.9408. Deployment memex-portal-deployment in namespace memex: its template (ReplicaSet memex-portal-deployment-85f748bdd7) runs meshweaver.azurecr.io/memex-portal-ai:3.0.0-ci.9413, while 3 ready pod(s) serve meshweaver.azurecr.io/memex-portal-ai:3.0.0-ci.9408. New pod memex-portal-deployment-85f748bdd7-qvqf7 is not Ready 10 m after it started — past its startup budget of 10 m. Roll in flight since 2026-09-26 17:19:25Z; budget startup probe 600 s × 3 replica(s) = 30 m per roll. Pod memex-portal-deployment-85f748bdd7-qvqf7: phase Running, 0 restart(s), started 2026-09-26 17:19:25Z; readiness: timing: 92ms total over 18 check(s), slowest first — db_version 92ms; PostgreSql 79ms; pending_module_activation 26ms; data_volume_free_space 13ms; 14 more under 10ms | content-types: Degraded — 1 node type(s) whose content this replica cannot type — the CLR type is not registered in THIS process, so their pages render empty. Commonest cause, and the one to check first: a dynamic NodeType register…. A Roll action that reported Done has only SET the image — this is what the cluster did with it. The remedy is the cause the pod names, not another roll and not a pin. Observed template 3.0.0-ci.9413 — 0/1 new pod(s) Ready; serving 3.0.0-ci.9408; expected every desired replica on 3.0.0-ci.9413 within 30 m.
    
  5. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-26)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 11475f707fef2e3d
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail `[FleetWatch] roll alarm StuckRoll on memex: memex: Stuck roll — {n}.{n}-ci.{n} is not taking over from {n}.{n}-ci.{n}. Deployment memex-portal-deployment in namespace memex: its template (ReplicaSet memex-portal-deployment-{n}f7{n}bdd7) runs {path}:{n}.{n}-ci.{n}, while {n} ready pod(s) serve {path}:{n}.{n}-ci.{n}. New pod memex-portal-deployment-{n}f7{n}bdd7-{n}t2l4 is not Ready {n} m after it started — past its startup budget of {n} m. Roll in flight since {time}; budget startup probe {n} s × {n} replica(s) = {n} m per roll. Pod memex-portal-deployment-{n}f7{n}bdd7-{n}t2l4: phase Running, {n} restart(s), started {time}; readiness: timing: {n}ms total over {n} check(s), slowest first — pending_module_activation {n}ms; {n} more under {n}ms
    Namespace memex
    Pods memex-portal-deployment-85f748bdd7-nk4wg
    Occurrences 1
    First seen 2026-09-26 17:49:56Z
    Last seen 2026-09-26 17:49:56Z
    Already folded here 6 fingerprint(s)
    Incident Admin/_LogIncident/11475f707fef2e3d
    Triage called it StuckRoll keeps firing Critical on a memex roll that is converging: the startup-only budget ignores the bake-gated readiness window (third occurrence)
    What triage wrote about this fingerprint

    Likely duplicate of Systemorph/MeshWeaver#5757, with the root cause in Systemorph/MeshWeaver.Plugins#2411. This is the third StuckRoll on memex today and the second on the same roll. Incident 3f099caacdba2bf4 fired at 17:29Z on the same roll (ReplicaSet memex-portal-deployment-85f748bdd7, 3.0.0-ci.9408 → 3.0.0-ci.9413). A human can close this as a duplicate and attach the evidence below to #5757 / #2411.

    What is failing

    The fleet watch's stuck-roll rule (RollAlarms.StuckRoll) raised a Critical StuckRoll on memex through its per-pod lateStart trigger. The third new pod, …-8t2l4, was not Ready 11 m after it started, against a 10 m startup-probe budget. At 17:49Z the roll was converging:

    • 2 of 3 new pods were Ready. So qvqf7, the pod the 17:29Z alarm called stuck, did become Ready. That answers the open question on #5757: that alarm was a false positive.
    • 8t2l4 was Running with 0 restarts, and its 18 readiness checks were fast (25 ms total).
    • One old ci.9408 pod was still serving, so users kept being served.

    The roll had also just passed its 30 m budget (in flight since 17:19:25Z, which is about 30.5 m), so the overran trigger was about to fire as well. A surge roll that starts its pods one after another, each gated on a bake, cannot fit a startup × replicas budget.

    Probable cause (medium–high confidence)

    The cause is the one #2411 describes.

    • Budget.Startup and Budget.Roll come only from the record's startupProbe (600 s here). lateStart and overran are judged against those numbers.
    • Since MeshWeaver#5544, the NodeType bake gates readiness. The chart's progressDeadlineSeconds allows extra time for that bake. The alarm does not.
    • Supporting evidence: the concurrent incident 8b92e657d4cd1295 (MeshWeaver#5722). A pod of this same new ReplicaSet (…-nk4wg) reported nodetype_bake Unhealthy from 17:37Z to 17:38Z, while it was batch-compiling 2 NodeTypes and "waiting on Crm/Client, for up to 00:05:00". So each new pod spends minutes not Ready on the bake, and that is by design.

    Not established: whether 8t2l4 became Ready later. If it did not, look at what gates its readiness, not at the alarm.

    Secondary defect, again: Quote cuts the pod's readiness detail at ReadinessQuote = 400 characters. Almost all of that is the timing preamble and a content-types: Degraded entry, which is not a readiness gate. The check that actually keeps the pod not Ready (probably nodetype_bake) never appears in the quote, even though the alarm tells operators to act on "the cause the pod names".

    Impact

    There is no user-facing failure: old pods keep serving until new ones are Ready. The cost is repeated false Critical alarms on the control instance, three in about two hours. Each one sends an operator to a healthy roll, and together they teach operators to ignore StuckRoll. That is the silence this alarm was built to end. Every bake-gated roll will keep firing it. This is a monitoring defect with an easy manual check, so sev:M.

    Where to look

    • Hosting/Issue/Source/RollAlarms:
      • Budget.Startup / Budget.Roll, and RecordFactsOf, which reads only startupProbe.
      • In StuckRoll: the lateStart and overran triggers.
      • Quote / ReadinessQuote: put the non-Healthy readiness-gating entries (such as nodetype_bake) first, and drop the timing summary.
    • The fix direction in HOTFIX: main is red — restore the using MeshOperations needs #2411: size both triggers from the chart's progress deadline (InstanceActionPlan.ProgressDeadlineSeconds), and keep a tighter separate signal for pods that crash-loop or never start.
    • RollAlarmsTests (TheBudget_IsTheRecordsOwn, EachTrigger_FiresOnItsOwn) pin the current numbers.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-26 17:49:56Z
    • Pods: memex-portal-deployment-85f748bdd7-nk4wg
    Recent log lines
    2026-09-26 17:49:56Z memex-portal-deployment-85f748bdd7-nk4wg fail: FleetWatch[0]
          [FleetWatch] roll alarm StuckRoll on memex: memex: Stuck roll — 3.0.0-ci.9413 is not taking over from 3.0.0-ci.9408. Deployment memex-portal-deployment in namespace memex: its template (ReplicaSet memex-portal-deployment-85f748bdd7) runs meshweaver.azurecr.io/memex-portal-ai:3.0.0-ci.9413, while 1 ready pod(s) serve meshweaver.azurecr.io/memex-portal-ai:3.0.0-ci.9408. New pod memex-portal-deployment-85f748bdd7-8t2l4 is not Ready 11 m after it started — past its startup budget of 10 m. Roll in flight since 2026-09-26 17:19:25Z; budget startup probe 600 s × 3 replica(s) = 30 m per roll. Pod memex-portal-deployment-85f748bdd7-8t2l4: phase Running, 0 restart(s), started 2026-09-26 17:38:37Z; readiness: timing: 25ms total over 18 check(s), slowest first — pending_module_activation 25ms; 17 more under 10ms | content-types: Degraded — 1 node type(s) whose content this replica cannot type — the CLR type is not registered in THIS process, so their pages render empty. Commonest cause, and the one to check first: a dynamic NodeType registers its content type only when one of its instances activates her…. A Roll action that reported Done has only SET the image — this is what the cluster did with it. The remedy is the cause the pod names, not another roll and not a pin. Observed template 3.0.0-ci.9413 — 2/3 new pod(s) Ready; serving 3.0.0-ci.9408; expected every desired replica on 3.0.0-ci.9413 within 30 m.
    
  6. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-09-26)

    2026-09-26 ~19:40Z — build now hands detected releases to the control lane (apply=control-lane)

    Governed path on memex.systemorph.com, record from Memex#567 (Hosting__ControlInbox__Secret ← vault object Hosting-PlatformWebhookSecret, the object build already mounts as Hosting__PlatformWebhookSecret):

    step node result
    dry run Ops/Actions/reconcile-build-20260926-control-inbox-dryrun plan 2c327f29675c, 9 steps, running image kept
    Reconcile (approved by rbuergi) Ops/Actions/reconcile-build-20260926-control-inbox aks-ops run 36266185606 success, helm rev 4, values 6283 → 6377 bytes, Healthy 1/1 on 3.0.0-ci.9412
    boot line of the rolled pod df9599fc5-rxrj8 (19:31:36Z) Ops/Logs/build-1790451096428006003-599fc5-rxrj8 still apply=detect-only (… Hosting:ControlInbox:Secret is empty …)
    Restart Ops/Actions/restart-build-20260926-control-inbox-env aks-ops run 36266565101 success, generation 8
    boot line of pod 56594547b6-4snsf (19:37:14Z) Ops/Logs/build-1790451434155513279-4547b6-4snsf registry=cr.meshweaver.cloud/memex-portal-ai … (instance-key auth; key validated at memex.meshweaver.cloud), canPatch=False, apply=control-lane (a detected release is handed to https://memex.systemorph.com/api/hooks/Hosting/PlatformBuilds; the control plane rolls)

    So the registry half (instance key presented to cr.meshweaver.cloud) and the hand-over half are both live on build.

    Why a second restart was needed (not measured, filed to triage as rbuergi/Feedback/reconcile-new-kv-key-needs-second-restart-20260926): the key reaches the pod through envFrom of the CSI-synced Secret build-portal-keyvault; the cluster's provider runs with enableSecretRotation=true, and the likely order is that the pre-existing synced Secret got the new key on a rotation pass after the rolled container had already resolved its env. The Reconcile reported Healthy with the key absent from the process.

    Still open — the second acceptance: a promoted build newer than 3.0.0-ci.9412 (memex already rolled to 3.0.0-ci.9419) must open a selfupdate-roll-build-… action on the control instance. The self-updater is event-driven with a 1 h safety net, so that is expected by ~20:37Z at the latest; not yet observed at the time of this comment.

  7. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-27)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint c0b6fd714465a127
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on memex: memex: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. memex runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: Roll {n}.{n}-ci.{n} ({path}) is Running, phase '{value}': ⏳ Step {path} — Verify one generation… Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-6d4fbcfddf-nlf8t
    Occurrences 1
    First seen 2026-09-27 01:01:56Z
    Last seen 2026-09-27 01:01:56Z
    Already folded here 8 fingerprint(s)
    Incident Admin/_LogIncident/c0b6fd714465a127
    Triage called it A self-roll of the control instance loses its post-run observer, and the orphaned Running action holds the roll lane for hours past its window
    What triage wrote about this fingerprint

    What is failing

    FleetWatch's StalePortal alarm on memex (the control instance) is reporting a real lag of 5 h. The alarm itself is working. The lag comes from the roll lane. Each self-update Roll on memex loses the process that runs its post-run phases ([6/8] Verify one generation onward). The action then stays Running until a "replacement process" resumes it. Because SelfUpdateRouting.Decide treats a Running roll as in flight, no newer build can open a roll while it waits.

    Probable cause (confidence: medium on the mechanism, low on why the resume is slow)

    The two memex roll actions show it:

    • Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9419-d8d5fb6a
      • The operator run succeeded at 2026-09-26T18:59:04Z, setting the image at rollout generation 819.
      • [6/8] Verify one generation started at 18:59:04Z.
      • The next entry is at 2026-09-27T00:21:14Z: "its observer was lost before the phases after it ran; a replacement process is resuming the post-run verification phases".
      • Verification then completed in 1 s: 3/3 ready, Degraded.
      • Its observedUntil was 2026-09-26T21:59:34Z, so the action sat Running for ~2 h 20 m past its own window and ~5 h 20 m in total.
      • Newer builds were promoted from 20:01Z, and none of them could open a roll during that time. That gap is exactly the 5 h this alarm measured.
    • Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9435-307acd52
      • It opened 22 min after the 9419 roll was released (00:43Z).
      • The observer was lost again after the 00:44:55Z callback.
      • It was resumed at 00:56:07Z and again at 00:56:18Z: two "replacement process is resuming" pairs, and the whole callback block appears three times. That looks like two resumers racing, or the callback being replayed.
      • At alarm time it was still in Verify one generation, with memex still serving ci.9419.

    The likely reason the observer is lost every time: this roll replaces the pods of the control instance, and the control instance is what hosts the observer. So every memex self-roll kills its own observer. That is inference and has not been verified in code.

    This is a follow-on to the orphaned-Running failure in MeshWeaver.Plugins#2178 (see Why the Fleet Stopped Rolling Itself, section "2026-09-20"). A resume path now exists, so the action no longer stays Running forever. But the resume fires hours after observedUntil instead of at pod start or when the window lapses, and it can fire twice.

    Impact

    • One occurrence, one pod, memex only.
    • The portal serves (3/3 Ready).
    • The cost is delivery latency on the control instance: every memex self-roll can hold the lane for hours, and each held roll pushes the next build past the two-CD-cycle bound.
    • Workaround: an operator can close the stale action by hand.

    The primary automatic-delivery path is slowed rather than broken, so this is sev:M. If the same pattern also holds memex-cloud's lane, re-rule it higher. selfupdate-roll-memex-cloud-3-0-0-ci-9435 was modified at 00:51Z, which is worth a look.

    Where to look

    • The InstanceAction runner's observer hand-off and resume path (the code that writes "a replacement process is resuming the post-run verification phases"):
      • What triggers the resume, and why it did not fire at observedUntil or on a new pod's startup.
      • Whether it is single-flight (see the duplicate resume on the 9435 roll).
    • SelfUpdateRouting.Decide (Hosting/Deployment/Source/SelfUpdateRouting): it could treat a Running action past its observedUntil as lapsed, so a newer announcement can supersede it.
    • The alarm rule is StalePortal in Hosting/Issue/Source/RollAlarms.cs. It reported correctly and needs no change. The live issue node is Ops/Issue/memex__StalePortal.

    Related: MeshWeaver.Plugins#2178 (orphaned Running action blocks the lane). MeshWeaver#5757 is the build StalePortal ticket, which has a different cause (no announcement at all) and is not a duplicate.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-27 01:01:56Z
    • Pods: memex-portal-deployment-6d4fbcfddf-nlf8t
    Recent log lines
    2026-09-27 01:01:56Z memex-portal-deployment-6d4fbcfddf-nlf8t fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex: memex: Stale portal — still on 3.0.0-ci.9419, newest promoted is 3.0.0-ci.9435. memex runs 3.0.0-ci.9419. A newer compatible build was first promoted 2026-09-26 20:01:13Z (5 h 0 m ago); the newest is 3.0.0-ci.9435. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: Roll 3.0.0-ci.9435 (Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9435-307acd52) is Running, phase 'Verify one generation': ⏳ Step 1/3 — Verify one generation… Observed running 3.0.0-ci.9419; expected a build no more than 5 h 0 m behind the newest promoted.
    
  8. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-09-27)

    Production trace on 2026-09-27 narrows the cloud recurrence to an orphaned Roll, rather than a silent announcer.

    • Cloud log action Ops/Actions/verify-5757-cloud-20260927-check-verdicts read and landed 100 lines, 0 failed, truncated. Positive record Ops/Logs/memex-cloud-1790515994320940093-9cd496-r922l, timestamp 13:33:14.320Z, says the ci.9464 handoff was accepted (200), signature verified at the control inbox. This is a positive announcement witness; the truncated collection is not an absence sweep.
    • Anchored Ops/Actions search for content.deployment:Deployments/memex-cloud lastModified:>2026-09-27T12:00:00Z returned 0, untruncated, coverage ["ops"]. The old ci.9443 Roll was still present and Running / Verify one generation: Ops/Actions/selfupdate-roll-memex-cloud-3-0-0-ci-9443-59eeabf9, v22, last modified 06:15:30Z, observation deadline 09:16:00Z. Current Ops/Status/memex-cloud already showed five Ready ci.9443 replicas and a converged roster.
    • Reading that existing action activated its resume path. It became Done at 13:45:43.994Z, v31: replacement-process resume at 13:45:41Z, generation verification completed at 13:45:42Z, 5/5 Ready, outcome recorded. No operator step was rerun. This was not a manual state patch or a new Roll.

    The receiver code's SelfUpdateRouting.Decide skips every newer announcement while an existing Roll/Restart remains in an open state. This old action supplies that blocker. The problem remains open: a read-triggered resume is not evidence that the automatic startup resumer is live. Plugins#2403 tracks delivery of that native fix; new ci.9462 control replicas still load the old September 18 SelfUpdate.Aks generation.

    Build is a separate unresolved branch. Its fresh pod memex-portal-deployment-6c54474dff-lt8xt starts ci.9412 at 12:20Z. Governed action Ops/Actions/verify-5757-build-20260927-startup collected 19 read, 19 landed, 0 failed, untruncated. Startup positively reports OCI instance-key auth and apply=control-lane; startup/safety-net checks successfully list 1305/1308 tags, but select none newer than ci.9412. Deployments/build and the generated public Helm values declare Continuous / 3.0.0-ci*; those values seed only a newly created Admin/UpdatePolicy and do not prove an existing persisted record. Its actual Admin policy is not yet verified: the browser session reaches /setup with Anonymous denied Read on Admin. No policy or permissions were changed.

  9. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-09-27)

    Further production evidence, 2026-09-27 13:59 UTC:

    Once the old ci.9443 Roll was resumed to its verified terminal state, the normal self-update route admitted a new cloud Roll without a manual Roll request: Ops/Actions/selfupdate-roll-memex-cloud-3-0-0-ci-9464-0bcb36f7, created 13:47:38Z, origin self-update, target ci.9464. Its operator run https://github.com/Systemorph/Memex/actions/runs/36323630919 completed successfully, including migration version 58 and deployment generation 1591.

    The control plane is still in Verify one generation (action v21). The latest fleet sample at 13:57:05Z reports all five new ci.9464 replicas Ready, commit 2bb14d8db95fb9dfbacfdfd96111a2f05dabfb63, and two old ci.9443 replicas terminating. converged remains false: do not read the successful operator callback as full rollout completion.

    This is positive evidence that the cloud announcement/receiver/routing lane works after the older Running action is completed. It does not prove the startup action-resumer fix has been delivered to the control process, and does not answer the separate build instance's persisted update-policy question. Keep this issue open.

  10. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-29)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint c538e167a7187f52
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on control: control: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. control runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: no self-update Roll was opened for control for any build newer than {n}.{n}-ci.{n} — its self-updater has not announced one (read the instance's {path} and its self-update log) Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-79956556d6-qwxbp
    Occurrences 2
    First seen 2026-09-29 08:09:56Z
    Last seen 2026-09-29 08:16:58Z
    Already folded here 12 fingerprint(s)
    Incident Admin/_LogIncident/c538e167a7187f52
    Triage called it Control instance cannot take self-update rolls — no ControlInbox wiring on its record, and the StalePortal bound ignores its roll gate
    What triage wrote about this fingerprint

    The control deployment — the fleet's dedicated control instance, provisioned 2026-09-26 — declares updatePolicy: Continuous on 3.0.0-ci*, but no self-update Roll has ever been opened for it: every roll since provisioning has been a manual roll-control-* action. It now sits behind the fleet's newest promotion with nothing that will move it. FleetWatch's judgement is correct and its blocker ("no self-update Roll was opened … its self-updater has not announced one") is accurate — this ticket is about why, which the alarm cannot see from the action history.

    Probable cause — one dead lane, two compounding defects (confidence: medium-high on the first, certain on the second and third).

    1. The control instance has no announce lane. A Roll for control is opened on the acting control plane only when the control instance's own self-updater POSTs a signed self-update-available event to Hosting__ControlInbox__Url. Every portal record carries that pair — Deployments/memex-cloud declares Hosting__ControlInbox__Url: https://memex.systemorph.com/api/hooks/Hosting/PlatformBuilds plus Hosting__ControlInbox__Secret from the vault — but Deployments/control carries neither, in extraPortalConfig or keyVaultSecrets, and its own notes defer exactly this wiring to the cutover ("The inbox target … and the Hosting__ReportTo/ControlInbox wiring … arrive at the cutover, §8 steps 6.1–6.4"). The record renders the pod's config, so the updater has nowhere to hand a build to. I could not read the control instance's own Admin/UpdatePolicy or self-update log from this mesh — confirming that is step 1 below.
    2. Even with the lane wired, the record's own roll gate holds right now. control is a gated record: rollGate: after [memex-cloud, memex], soakMinutes: 120, approval: required — it rolls LAST, by its own declaration. RollGates.Evaluate holds the gate on any open Critical issue of a followed deployment, and Ops/Issue/memex-cloud__StalePortal is open at Critical (memex-cloud's own updater is silent too — #5757, third recurrence). Control cannot take any build memex-cloud has not converged on.
    3. The alarm's bound has no gate term. RollAlarms.StalePortal bounds staleness at two of the record's own CD cycles (5 h 30 m at control's declared budget) with no term for the gate's 120-min soak, the followed deployments' convergence, or the required approval — so a gated record doing exactly what its record declares trips this alarm whenever the fleet promotes faster than that. And Blockers reads only the action history, so "announced, gate WAITING" is reported with the same words as a dead announce lane.

    Impact. Control serves (3/3 ready); this is build-delivery lag on the fleet's operational hub, not an outage, and nothing user-facing is affected. But Continuous is declared and inert, every catch-up is a manual roll (three since 2026-09-26), and the alarm recurs on each promotion wave past the bound. Easy workaround (open the Roll by hand) → sev:M.

    Where to look.

    1. On the control instance: Admin/UpdatePolicy (lastCheckVerdict, handedOverTag, lastCheckedAt) and its [SelfUpdate] lines since the first newer promotion — did the updater see a newer build, and did the hand-over have a URL to POST to?
    2. Deployments/control: add the Hosting__ControlInbox__Url/Secret pair the portals carry (pre-cutover, pointing at the acting control plane), or park the record honestly until the §8 wiring lands.
    3. RollAlarms: derive the staleness bound from the gate when the record declares one, and make the blocker distinguish a dead lane from a gate WAIT.

    Not a duplicate of #5757 (that is memex-cloud's own dead updater) but coupled to it: memex-cloud's open Critical is what holds control's gate today. Sibling incident 551c35993737731f is the same control lag seen from the memex-cloud sweep as StalenessUnobserved.

    Still occurring: 2 more since the last update (2 total).

    • Last seen: 2026-09-29 08:16:58Z
    • Pods: memex-portal-deployment-79956556d6-qwxbp
    Recent log lines
    2026-09-29 08:09:56Z memex-portal-deployment-79956556d6-qwxbp fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on control: control: Stale portal — still on 3.0.0-ci.9554, newest promoted is 3.0.0-ci.9602. control runs 3.0.0-ci.9554. A newer compatible build was first promoted 2026-09-28 20:27:40Z (11 h 41 m ago); the newest is 3.0.0-ci.9602. Bound: two CD cycles = 5 h 30 m (progress deadline 55 m (startup probe 900 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 45 m per roll). Blocking: no self-update Roll was opened for control for any build newer than 3.0.0-ci.9554 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9554; expected a build no more than 5 h 30 m behind the newest promoted.
    2026-09-29 08:16:58Z memex-portal-deployment-79956556d6-qwxbp fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on control: control: Stale portal — still on 3.0.0-ci.9554, newest promoted is 3.0.0-ci.9602. control runs 3.0.0-ci.9554. A newer compatible build was first promoted 2026-09-28 20:27:40Z (11 h 48 m ago); the newest is 3.0.0-ci.9602. Bound: two CD cycles = 5 h 30 m (progress deadline 55 m (startup probe 900 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 45 m per roll). Blocking: no self-update Roll was opened for control for any build newer than 3.0.0-ci.9554 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9554; expected a build no more than 5 h 30 m behind the newest promoted.
    
  11. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-29)

    Still occurring: 1 more since the last update (2 total).

    • Last seen: 2026-09-29 10:02:29Z
    • Pods: memex-portal-deployment-6d4fbcfddf-nlf8t, memex-portal-deployment-5dc5995596-d9qj7
    Recent log lines
    2026-09-27 01:01:56Z memex-portal-deployment-6d4fbcfddf-nlf8t fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex: memex: Stale portal — still on 3.0.0-ci.9419, newest promoted is 3.0.0-ci.9435. memex runs 3.0.0-ci.9419. A newer compatible build was first promoted 2026-09-26 20:01:13Z (5 h 0 m ago); the newest is 3.0.0-ci.9435. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: Roll 3.0.0-ci.9435 (Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9435-307acd52) is Running, phase 'Verify one generation': ⏳ Step 1/3 — Verify one generation… Observed running 3.0.0-ci.9419; expected a build no more than 5 h 0 m behind the newest promoted.
    2026-09-29 10:02:29Z memex-portal-deployment-5dc5995596-d9qj7 fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex: memex: Stale portal — still on 3.0.0-ci.9590, newest promoted is 3.0.0-ci.9606. memex runs 3.0.0-ci.9590. A newer compatible build was first promoted 2026-09-29 04:59:36Z (5 h 2 m ago); the newest is 3.0.0-ci.9606. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: Roll 3.0.0-ci.9606 (Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9606-4130ebc8) is Running, phase 'Verify one generation': ⏳ Step 1/3 — Verify one generation… Observed running 3.0.0-ci.9590; expected a build no more than 5 h 0 m behind the newest promoted.
    
  12. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-29)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 1fa4db7c70073162
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on memex: memex: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. memex runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: no self-update Roll was opened for memex for any build newer than {n}.{n}-ci.{n} — its self-updater has not announced one (read the instance's {path} and its self-update log) Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-54f589555d-xlshb
    Occurrences 1
    First seen 2026-09-29 15:14:29Z
    Last seen 2026-09-29 15:14:29Z
    Already folded here 13 fingerprint(s)
    Incident Admin/_LogIncident/1fa4db7c70073162
    Triage called it Orphaned Running Roll on memex makes SelfUpdateRouting skip every newer announcement — the control instance cannot take a new build (Plugins#2558 recurrence)
    What triage wrote about this fingerprint

    What is failing

    memex — the control instance — cannot take any new platform build automatically. Its ci.9606 self-update Roll is orphaned in state: Running at phase Verify one generation with observedUntil/convergeUntil = 2026-09-29T12:51:47Z, and SelfUpdateRouting.Decide treats that lapsed action as an in-flight rollout, returning Outcome.Skip for every newer announcement. So memex keeps serving ci.9606 while the fleet promoted ci.9608 hours ago. The StalePortal alarm fired correctly and on time (the lag crossed its two-CD-cycle bound the same hour) — but its blocker sentence, "its self-updater has not announced one", is false: Admin/UpdatePolicy on memex shows the self-updater announcing continuously, handing ci.9619 to the control lane at 15:10:20Z — four minutes before the alarm (trigger SafetyNet, signature verified). The announcements arrive and are consumed; nothing opens.

    Probable cause (confidence: high on the mechanism; why the resume died is unexplained)

    Recurrence of MeshWeaver.Plugins#2558 (filed 09:50Z today for the identical mechanism on memex-cloud, where an orphaned Restart held it off every routed Roll for 12 h): Decide's OpenStates includes Running and ExistingAction carries no ObservedUntil/ConvergeUntil, so a lapsed action suppresses announcements indefinitely — and the Skip logs at Information while the announcer keeps reading accepted (200).

    The ci.9606 roll itself worked (aks-ops run 36551360441 succeeded 09:51:17Z: migration v59, image set, rollout generation 840), then lost its observer at 10:01:05Z ("a replacement process is resuming the post-run verification phases"). The replacement re-started [1/3] Verify one generation at 10:01:06Z and then went silent — nothing has been written to the action since, and no reliable resume is coming: the RunningActionResumer from Plugins#2407 is still not registered on the instance that owns Ops/Actions (#2558), and the only resumes observed on this lane coincided with investigation reads. Every hourly announcement since (ci.9608 → … → ci.9619) was skipped against the orphan.

    Corroboration: memex-cloud received its ci.9608 Roll at 10:20Z, minutes after its own orphan went Done — the control-plane routing lane is healthy; the block is per-deployment. Not read directly: the control pod's Skip log lines for memex's announcements — the mechanism is inferred from the action's state and window, the policy hand-over and Decide's code, and matches #2558's measured account of the same behaviour.

    Secondary defect worth fixing alongside: RollAlarms.Blockers infers "has not announced" from "no Roll node exists for a newer tag" — exactly the false negative the Skip produces — so the alarm sends the operator to instruments (Admin/UpdatePolicy, the self-update log) that look healthy. Naming the deployment's newest open action (state + window vs the clock) would point at the orphan directly.

    Impact

    One instance — memex, the control instance. The portal serves (the ci.9606 roll completed; pods ready). The cost is delivery latency on the lane that opens every fleet roll: memex is 2+ builds behind and cannot catch up until the orphan is cleared, and there is no self-heal. Workaround: close or re-resume Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9606-4130ebc8 — the next hourly SafetyNet announcement then opens the roll automatically. Primary path broken with a workaround → sev:H, consistent with #2558.

    Where to look

    Related / duplicate status: MeshWeaver.Plugins#2558 is the same routing defect (sev:H, memex-cloud, filed 09:50Z today) — a human may merge this into it. Also related: Plugins#2403 (first occurrence of the orphaned-Running block), Plugins#2407 (the undelivered resumer), MeshWeaver#5757 (the observer-loss/resume-latency half on this same instance — same failure chain, different emphasis, not a duplicate). This ticket's delta over #2558: the recurrence on the control instance itself, which has no resumer and so will not self-heal, and the alarm's misdirecting blocker sentence.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-29 15:14:29Z
    • Pods: memex-portal-deployment-54f589555d-xlshb
    Recent log lines
    2026-09-29 15:14:29Z memex-portal-deployment-54f589555d-xlshb fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex: memex: Stale portal — still on 3.0.0-ci.9606, newest promoted is 3.0.0-ci.9608. memex runs 3.0.0-ci.9606. A newer compatible build was first promoted 2026-09-29 10:13:05Z (5 h 1 m ago); the newest is 3.0.0-ci.9608. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: no self-update Roll was opened for memex for any build newer than 3.0.0-ci.9606 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9606; expected a build no more than 5 h 0 m behind the newest promoted.
    
  13. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-29)

    Still occurring: 1 more since the last update (3 total).

    • Last seen: 2026-09-29 15:44:37Z
    • Pods: memex-portal-deployment-79956556d6-qwxbp, memex-portal-deployment-54f589555d-xlshb
    Recent log lines
    2026-09-29 08:09:56Z memex-portal-deployment-79956556d6-qwxbp fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on control: control: Stale portal — still on 3.0.0-ci.9554, newest promoted is 3.0.0-ci.9602. control runs 3.0.0-ci.9554. A newer compatible build was first promoted 2026-09-28 20:27:40Z (11 h 41 m ago); the newest is 3.0.0-ci.9602. Bound: two CD cycles = 5 h 30 m (progress deadline 55 m (startup probe 900 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 45 m per roll). Blocking: no self-update Roll was opened for control for any build newer than 3.0.0-ci.9554 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9554; expected a build no more than 5 h 30 m behind the newest promoted.
    2026-09-29 08:16:58Z memex-portal-deployment-79956556d6-qwxbp fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on control: control: Stale portal — still on 3.0.0-ci.9554, newest promoted is 3.0.0-ci.9602. control runs 3.0.0-ci.9554. A newer compatible build was first promoted 2026-09-28 20:27:40Z (11 h 48 m ago); the newest is 3.0.0-ci.9602. Bound: two CD cycles = 5 h 30 m (progress deadline 55 m (startup probe 900 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 45 m per roll). Blocking: no self-update Roll was opened for control for any build newer than 3.0.0-ci.9554 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9554; expected a build no more than 5 h 30 m behind the newest promoted.
    2026-09-29 15:44:37Z memex-portal-deployment-54f589555d-xlshb fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on control: control: Stale portal — still on 3.0.0-ci.9606, newest promoted is 3.0.0-ci.9619. control runs 3.0.0-ci.9606. A newer compatible build was first promoted 2026-09-29 10:13:05Z (5 h 31 m ago); the newest is 3.0.0-ci.9619. Bound: two CD cycles = 5 h 30 m (progress deadline 55 m (startup probe 900 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 45 m per roll). Blocking: no self-update Roll was opened for control for any build newer than 3.0.0-ci.9606 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9606; expected a build no more than 5 h 30 m behind the newest promoted.
    
  14. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-29)

    Still occurring: 1 more since the last update (2 total).

    • Last seen: 2026-09-29 20:37:17Z
    • Pods: memex-portal-deployment-79956556d6-qwxbp, memex-portal-deployment-856458cf8-wcx7d
    Recent log lines
    2026-09-29 05:15:31Z memex-portal-deployment-79956556d6-qwxbp fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex-cloud: memex-cloud: Stale portal — still on 3.0.0-ci.9564, newest promoted is 3.0.0-ci.9598. memex-cloud runs 3.0.0-ci.9564. A newer compatible build was first promoted 2026-09-29 00:10:46Z (5 h 4 m ago); the newest is 3.0.0-ci.9598. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: no self-update Roll was opened for memex-cloud for any build newer than 3.0.0-ci.9564 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9564; expected a build no more than 5 h 0 m behind the newest promoted.
    2026-09-29 20:37:17Z memex-portal-deployment-856458cf8-wcx7d fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex-cloud: memex-cloud: Stale portal — still on 3.0.0-ci.9608, newest promoted is 3.0.0-ci.9629. memex-cloud runs 3.0.0-ci.9608. A newer compatible build was first promoted 2026-09-29 15:37:03Z (5 h 0 m ago); the newest is 3.0.0-ci.9629. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: no self-update Roll was opened for memex-cloud for any build newer than 3.0.0-ci.9608 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9608; expected a build no more than 5 h 0 m behind the newest promoted.
    
  15. 28 remaining items

  16. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-27)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 8cdc5883a533216d
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on build: build: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. build runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} h {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: no self-update Roll was opened for build for any build newer than {n}.{n}-ci.{n} — its self-updater has not announced one (read the instance's {path} and its self-update log) Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-6d4fbcfddf-nlf8t
    Occurrences 1
    First seen 2026-09-27 00:41:20Z
    Last seen 2026-09-27 00:41:20Z
    Already folded here 7 fingerprint(s)
    Incident Admin/_LogIncident/8cdc5883a533216d
    Triage called it Self-update lane for build is silent again — no Roll announced while newer builds are promoted (recurrence after #5757)
    What triage wrote about this fingerprint

    What is failing

    The automatic self-update lane for the build deployment is again not delivering builds. Its portal serves ci.9412 while the newest promoted build is ci.9422, and FleetWatch names the blocker plainly: no self-update Roll was opened for build for any newer build — its self-updater has not announced one. This is the same signature as the episode filed as MeshWeaver#5757 (incident Admin/_LogIncident/24851d544b6ccf02), where build sat on ci.8411 for 7 d 11 h with its self-updater silent. build has since been moved forward (to ci.9412 — likely manually), but the announcing half still never fires, and the lag has now re-crossed the deployment's own bound (7 h 23 m vs 7 h 20 m).

    Probable cause (confidence: low — evidence points at the announcement lane, not at a specific refusal)

    Either build's own self-updater never emits self-update-available, or the control instance drops the announcement before a Roll opens. Two concrete things to check, in order:

    1. The announcement-key rollout from MeshWeaver#5757 (Hosting/SelfUpdateAnnouncementIdentity). That change made a record that declares announcementKeySecret refuse fleet-secret announcements silently (AnnouncementKeys.BindingRefusal — "a refused announcement is a silent stop, not an error page"). If build's Hosting/Deployment record declares the key but its pod still signs with the fleet secret (Hosting__ControlInbox__Secret not rendered, or the instance has not rolled the new signing half), its announcements are now refused with no visible action — exactly this alarm. This is the strongest hypothesis precisely because the fix that landed for the previous episode introduced this failure mode.
    2. The instance's own Admin/UpdatePolicy and its self-update log on the build instance, as the alarm text says — whether any check (…): update available line has been emitted at all, and what the control inbox logged when it received (or refused) one.

    I could not distinguish these from the control instance alone; the per-instance policy and self-update log are not in this mesh.

    Impact

    One customer-facing instance, build, is running code ~10 builds behind and drifting; it misses every fix promoted since. The portal still serves (the running pods are Ready), the lag is only just past the bound, and a manual Roll works — so this is not an outage, but the primary automatic-delivery path fails silently for this instance for the second recorded episode. Judged from the numbers: one occurrence, one pod, first alarm of this episode — small now, but the previous episode grew to 7 days because nothing else surfaces it.

    Where to look

    • Hosting/Deployment record for build: does it declare announcementKeySecret? If yes, check the control inbox's AnnouncementKey_* refusal logs and whether Hosting__PlatformWebhookSecret__build / the pod's Hosting__ControlInbox__Secret rendered correctly. Start from the design in Hosting/SelfUpdateAnnouncementIdentity (implemented per record in MeshWeaver#5757) and Hosting/Deployment/Source/SelfUpdateRouting.
    • The instance-side self-update log and Admin/UpdatePolicy on the build instance.
    • The alarm rules themselves live in Hosting/Issue/Source/RollAlarms.cs (FleetWatch StalePortal); the durable incident node is Ops/Issue/build__StalePortal.

    Likely duplicate/related: MeshWeaver#5757 covers the previous episode of this exact signature on build and client-b and carried the announcement-key fix. If the fix introduced the silence (hypothesis 1), this ticket tracks that regression; if it predates the fix's rollout order, it can be closed as a dup in seconds. Either way, a human should link them.

    Side note: like the previous incident, this log site puts the deployment name inside the masked message text, so stale-portal alarms for different deployments can fold or split unpredictably — the structured-field suggestion from #5757's ticket still stands.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-27 00:41:20Z
    • Pods: memex-portal-deployment-6d4fbcfddf-nlf8t
    Recent log lines
    2026-09-27 00:41:20Z memex-portal-deployment-6d4fbcfddf-nlf8t fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on build: build: Stale portal — still on 3.0.0-ci.9412, newest promoted is 3.0.0-ci.9422. build runs 3.0.0-ci.9412. A newer compatible build was first promoted 2026-09-26 17:17:08Z (7 h 23 m ago); the newest is 3.0.0-ci.9422. Bound: two CD cycles = 7 h 20 m (progress deadline 3 h 40 m (startup probe 10800 s + 600 s + bake window 1800 s) × 1 replica(s) = 3 h 40 m per roll). Blocking: no self-update Roll was opened for build for any build newer than 3.0.0-ci.9412 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9412; expected a build no more than 7 h 20 m behind the newest promoted.
    
  17. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-27)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 40fec26b16f8d914
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. client-b runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} h {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than {n}.{n}-ci.{n} — its self-updater has not announced one (read the instance's {path} and its self-update log) Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-5db78dfc99-d2cpk
    Occurrences 1
    First seen 2026-09-27 01:42:27Z
    Last seen 2026-09-27 01:42:27Z
    Already folded here 9 fingerprint(s)
    Incident Admin/_LogIncident/40fec26b16f8d914
    Triage called it client-b never announces self-updates, so it only moves when someone rolls it by hand (known: Memex#458) — StalePortal will re-fire every CD cycle
    What triage wrote about this fingerprint

    What is failing

    The client-b portal has no working automatic update path. Its self-updater never sends a self-update-available notice to the control instance, so no Roll is ever opened for client-b. FleetWatch's StalePortal rule is reporting that correctly: client-b runs ci.9414, and newer compatible builds have been promoted since 18:22Z. The alarm rule is working as intended.

    Probable cause (confidence: high that this is the known condition; low on the root mechanism)

    The last client-b roll, Ops/Actions/roll-client-b-20260926-9414, states the cause in its own title and reason:

    • Title: "cannot self-update".
    • Reason: "client-b cannot update itself (Memex#458), so it moves only by a Roll from the control instance."

    That roll was opened by hand (requested and approved by rbuergi at 17:51Z) to bring client-b from ci.9077 to ci.9414. It finished Done at 18:25Z, and client-b's health was Degraded. ci.9414 is exactly the build client-b still runs. Since then no roll action for client-b exists in Ops/Actions, which fits a self-updater that is silent rather than one whose announcements are refused.

    I could not read client-b's own Admin/UpdatePolicy or its self-update start-up line from this mesh. The start-up line would say whether the instance is in self-patch, control-lane or detect-only mode; see the control-lane hand-off note. Whether client-b is detect-only (the chart has not been redeployed with the control-lane config) or has an update policy of None is not confirmed. Those are the two likely readings of Memex#458.

    Side observation, not the cause of this alarm: the manual roll above also lost its observer twice (at 18:03Z and 18:10Z, "a replacement process is resuming"). That is the same pattern as the memex self-roll ticket (MeshWeaver#5757's sibling incident c0b6fd714465a127).

    Impact

    • One occurrence, one control-instance pod, one deployment.
    • client-b serves, but it drifts behind main until someone rolls it by hand. Before the 09-26 roll it was 672 commits behind, and it is Degraded on /health.
    • Workaround: a manual Roll from the control instance, which is what is being done today.
    • Expect this alarm to re-fire every CD cycle until Memex#458 is fixed.

    This is sev:M because a workaround exists and is in routine use. If client-b is meant to be on unattended delivery for this release, re-rule it to sev:H.

    Where to look

    • Memex#458 (client-b cannot self-update): this ticket is most likely a duplicate of it and can be closed against it.
    • MeshWeaver#5757 covered the same "self-updater has not announced one" signature for build and client-b, along with the announcement-key work in Hosting/SelfUpdateAnnouncementIdentity.
    • On client-b itself: Admin/UpdatePolicy and the self-update start-up log line (mode, and the config key named for detect-only).
    • Control side: Hosting/Deployment/Source/SelfUpdateRouting for any refused announcement. The alarm rule is StalePortal in Hosting/Issue/Source/RollAlarms.cs, and the live issue node is Ops/Issue/client-b__StalePortal.
    • Improvement: when a deployment is known not to self-update, StalePortal could say so ("moves only by manual Roll") instead of pointing at a self-updater log that will never show anything.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-27 01:42:27Z
    • Pods: memex-portal-deployment-5db78dfc99-d2cpk
    Recent log lines
    2026-09-27 01:42:27Z memex-portal-deployment-5db78dfc99-d2cpk fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on 3.0.0-ci.9414, newest promoted is 3.0.0-ci.9435. client-b runs 3.0.0-ci.9414. A newer compatible build was first promoted 2026-09-26 18:22:19Z (7 h 20 m ago); the newest is 3.0.0-ci.9435. Bound: two CD cycles = 7 h 20 m (progress deadline 3 h 40 m (startup probe 10800 s + 600 s + bake window 1800 s) × 1 replica(s) = 3 h 40 m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than 3.0.0-ci.9414 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9414; expected a build no more than 7 h 20 m behind the newest promoted.
    
  18. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-27)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint cdd1d1fbe1d24628
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on memex-cloud: memex-cloud: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. memex-cloud runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: no self-update Roll was opened for memex-cloud for any build newer than {n}.{n}-ci.{n} — its self-updater has not announced one (read the instance's {path} and its self-update log) · the portal reports pending_module_activation: Degraded — {n} module(s) are landed but not yet loaded in this process — a restart activates them: MeshWeaver.Observability, MeshWeaver.Testing · the portal reports pending_module_activation: Degraded — {n} module(s) are landed but not yet loaded in this process — a restart activates them: MeshWeaver.Azure.Blob, MeshWeaver.Blazor.OpenStreetMap, MeshWeaver.Courses, MeshWeaver.Markdown.Export, MeshWeaver.Northwind.Application, MeshWeaver.SelfUpdate.Aks, MeshWeaver.Speech Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-7c6dfb8bbb-fhbxf
    Occurrences 1
    First seen 2026-09-27 12:07:44Z
    Last seen 2026-09-27 12:07:44Z
    Already folded here 10 fingerprint(s)
    Incident Admin/_LogIncident/cdd1d1fbe1d24628
    Triage called it memex-cloud stuck on 3.0.0-ci.9443 for a second day: self-updater announces no Roll, portal degraded with 9 landed-but-unloaded modules
    What triage wrote about this fingerprint

    Recurrence of Systemorph/MeshWeaver#5757 (memex-cloud StalePortal, filed 2026-09-26) — same deployment, same signature (no self-update Roll was opened … its self-updater has not announced one), but a day later, against newer builds and with a different blocking clause. If #5757 is still open, treat this as evidence the fix has not landed and close as duplicate; the new evidence below is what changed.

    What is failing

    memex-cloud is not taking promoted builds on its own. It runs 3.0.0-ci.9443 while 3.0.0-ci.9445 is the newest promoted, and no self-update Roll was ever opened for anything newer than ci.9443 — the instance's self-updater has not announced one. FleetWatch itself is working correctly: the alarm fired 5 h 1 m after a compatible build was first promoted, past its 5 h bound (two CD cycles).

    Probable cause (confidence: medium)

    The blocking evidence has changed since #5757: the portal now reports pending_module_activation: Degraded — 9 modules are landed but not loaded in this process (MeshWeaver.Observability, MeshWeaver.Testing, then Azure.Blob, Blazor.OpenStreetMap, Courses, Markdown.Export, Northwind.Application, SelfUpdate.Aks, Speech), and per the portal's own health text a restart activates them. That is consistent with the fleet's rule that a degraded instance does not roll, but note the apparent deadlock: the modules need a restart, the self-updater that would trigger the roll is silent (and MeshWeaver.SelfUpdate.Aks itself is among the not-yet-loaded modules). I have not confirmed this from the instance's self-update log — read Admin/UpdatePolicy on memex-cloud and its self-update log as the alarm directs; that is the first thing to check.

    Note also this is the second day in a row for memex-cloud, and StalePortal alarms fired today on build, memex and client-b as well — the pattern from #5757 (3 of 5 instances not self-updating) continues.

    Impact

    The portal serves (its replicas are up; FleetWatch judged it readable). This is build-delivery lag, not an outage — but it is now recurring daily, the lag grew from ~1 h to ~5 h, and the not-yet-loaded modules mean the running process is missing nine modules' worth of shipped functionality until a restart happens. Manual workaround: restart the portal to activate the landed modules, and/or open a Roll by hand. Judged sev:M; raise if the lag keeps growing across CD cycles.

    Where to look

    • On memex-cloud: Admin/UpdatePolicy and the self-update log — why no Roll was announced for anything newer than 3.0.0-ci.9443.
    • The pending_module_activation health check: what leaves 9 landed modules unloaded in a running process, and whether a silently-degraded instance should block the very roll that would restart it.
    • The self-update announcement → Roll handler on the control plane (also under suspicion in #5757).
    • Tracking node: Ops/Issue/memex-cloud__StalePortal (already open from yesterday).
    • Detector/source: RollAlarms.StalePortal / FleetWatch.FileAlarm in Hosting/Issue/Source/FleetWatch.

    Side note (message formatting): the alarm repeats the pending_module_activation: Degraded clause twice with different module lists (2 modules, then 7) — apparently one per replica — which makes the real evidence harder to read. Deduplicate per-replica health clauses; see the same note on #5757.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-27 12:07:44Z
    • Pods: memex-portal-deployment-7c6dfb8bbb-fhbxf
    Recent log lines
    2026-09-27 12:07:44Z memex-portal-deployment-7c6dfb8bbb-fhbxf fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex-cloud: memex-cloud: Stale portal — still on 3.0.0-ci.9443, newest promoted is 3.0.0-ci.9445. memex-cloud runs 3.0.0-ci.9443. A newer compatible build was first promoted 2026-09-27 07:06:33Z (5 h 1 m ago); the newest is 3.0.0-ci.9445. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: no self-update Roll was opened for memex-cloud for any build newer than 3.0.0-ci.9443 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) · the portal reports pending_module_activation: Degraded — 2 module(s) are landed but not yet loaded in this process — a restart activates them: MeshWeaver.Observability, MeshWeaver.Testing · the portal reports pending_module_activation: Degraded — 7 module(s) are landed but not yet loaded in this process — a restart activates them: MeshWeaver.Azure.Blob, MeshWeaver.Blazor.OpenStreetMap, MeshWeaver.Courses, MeshWeaver.Markdown.Export, MeshWeaver.Northwind.Application, MeshWeaver.SelfUpdate.Aks, MeshWeaver.Speech Observed running 3.0.0-ci.9443; expected a build no more than 5 h 0 m behind the newest promoted.
    
  19. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by @rbuergi on 2026-09-27)

    Fresh production evidence separates the two affected installations; this issue remains open.

    ClientB: governed Logs action verify-5757-client-b-20260927-selfupdate-latest completed with 6/6 lines landed, zero failed, untruncated. At 2026-09-27 14:32:49Z, pod memex-portal-deployment-9d68d74dc-shp8l detected 3.0.0-ci.9464 but reported detect-and-notify because Hosting:ReportTo names the control instance while Hosting:ControlInbox:Secret is empty. Deployments/client-b v99 and its declared public Helm overlay both omit the control-inbox secret mapping. This is a named signing-configuration gap, not evidence of a stopped updater. Adding that mapping awaits the maintainer's security decision; no key has been read, copied, or granted by this investigation.

    Build: governed Logs action verify-5757-build-20260927-selfupdate-latest completed with 17/17 lines landed, zero failed, untruncated. At 14:21:44Z, pod memex-portal-deployment-6c54474dff-lt8xt handed a pending-module restart to the control lane and received accepted (200), signature verified. The replacement memex-portal-deployment-557c6767bc-dkc9p started its self-updater at 14:23:10Z on 3.0.0-ci.9412; its 14:23:26Z startup check listed 1308 tags and reported none newer than its installed version. The signed route works on Build; the reason no newer release is selected is still unproven and requires its effective policy/selection evidence. A successful restart does not prove its roll cadence fixed.

    The Cloud ci.9464 roll action completed at 14:25:12Z, but that action is not acceptance for Build or ClientB. Later fleet samples show another Cloud generation; each rollout and each named instance needs its own evidence.

  20. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-29)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint ae03c2b1c1b948f6
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on memex-cloud: memex-cloud: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. memex-cloud runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: no self-update Roll was opened for memex-cloud for any build newer than {n}.{n}-ci.{n} — its self-updater has not announced one (read the instance's {path} and its self-update log) Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-79956556d6-qwxbp
    Occurrences 1
    First seen 2026-09-29 05:15:31Z
    Last seen 2026-09-29 05:15:31Z
    Already folded here 11 fingerprint(s)
    Incident Admin/_LogIncident/ae03c2b1c1b948f6
    Triage called it memex-cloud self-updater announces no Roll for promoted builds — third StalePortal occurrence, now the only instance still affected
    What triage wrote about this fingerprint

    Third occurrence of Systemorph/MeshWeaver#5757 — same deployment (memex-cloud), same blocking signature (no self-update Roll was opened … its self-updater has not announced one), after the 2026-09-26 and 2026-09-27 occurrences already on that ticket. If #5757 is still open, fold this in as evidence and close as duplicate; the fact that is NEW is below.

    What is failing

    memex-cloud is not taking promoted builds on its own. It runs 3.0.0-ci.9564 while 3.0.0-ci.9598 is the newest promoted compatible build, and no self-update Roll action exists for this deployment for anything newer than what it runs — its self-updater has not announced one. FleetWatch itself is behaving correctly: the alarm fired 4 minutes past its declared bound of two CD cycles.

    Probable cause (confidence: medium-low)

    This occurrence narrows the fault. Each earlier occurrence named a second blocker from the portal's own health — an unsealed publication (Manufacturing, 09-26) and pending_module_activation with nine landed-but-unloaded modules, including MeshWeaver.SelfUpdate.Aks itself (09-27). This one names none: the blocker list carries only the silent self-updater. So the "a degraded instance declines to roll" hypothesis #5757 was chasing no longer explains the silence — with the portal's seal and module activation now reading clean, the self-updater still announces nothing.

    That points at the announcement path itself: the instance's registry watch / availability and combo gates (which select a candidate), the announcement reaching the control inbox, or the control lane turning an announcement into a Roll action. The record is not holding (a updatePolicy: None record does not alarm), not pinning (a pin would be named as the blocker), and the build class matches its updatePattern (it is judged compatible), so the policy on paper is willing. I cannot read memex-cloud's self-update log from the control instance; the alarm's own direction — read the instance's Admin/UpdatePolicy and its self-update log — is the first check.

    Two further observations:

    • The sibling instances that tripped alongside it (build, memex, client-b) have been quiet since 09-27 — this is now the only instance still tripping StalePortal, which argues for an instance-local fault (policy or updater state) over the control plane.
    • It does move eventually: the running tag advanced ci.9349 → ci.9443 → ci.9564 across the three occurrences and each occurrence's pod carries a different ReplicaSet hash — consistent with manual restarts/rolls clearing it, then falling behind again within about a day.

    Impact

    The portal serves; this is build-delivery lag on one production instance, not an outage, and it has so far always recovered (with help). But delivery to memex-cloud now needs manual intervention on roughly a daily cadence, and anything fixed in newer builds — including security fixes — lands late on that instance. Judged sev:M; raise if the lag grows well past the bound or the siblings relapse.

    Where to look

    • On memex-cloud: Admin/UpdatePolicy and the self-update log — whether an update for anything newer than 3.0.0-ci.9564 was ever considered, refused or gated, and by which gate.
    • The announcement → Roll routing on the control plane: confirm the earlier "no Hosting/Deployment record" drop class for memex-cloud (seen 2026-09-20) really stopped.
    • RollAlarms.Blockers — the "no self-update Roll" clause is derived from the fleet's self-update action history (Ops/Actions, origin self-update); distinguishing announced but never became a Roll from never announced splits the remaining suspects in two.
    • Tracking node Ops/Issue/memex-cloud__StalePortal, open across all three occurrences.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-09-29 05:15:31Z
    • Pods: memex-portal-deployment-79956556d6-qwxbp
    Recent log lines
    2026-09-29 05:15:31Z memex-portal-deployment-79956556d6-qwxbp fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on memex-cloud: memex-cloud: Stale portal — still on 3.0.0-ci.9564, newest promoted is 3.0.0-ci.9598. memex-cloud runs 3.0.0-ci.9564. A newer compatible build was first promoted 2026-09-29 00:10:46Z (5 h 4 m ago); the newest is 3.0.0-ci.9598. Bound: two CD cycles = 5 h 0 m (progress deadline 50 m (startup probe 600 s + 600 s + bake window 1800 s) × 3 replica(s) = 2 h 30 m per roll). Blocking: no self-update Roll was opened for memex-cloud for any build newer than 3.0.0-ci.9564 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) Observed running 3.0.0-ci.9564; expected a build no more than 5 h 0 m behind the newest promoted.
    
  21. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-09-30)

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site b164c7a435ab60de (FleetWatch), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 9f0b1d5d6d00bab1
    Log site b164c7a435ab60de
    Category FleetWatch
    Severity Error
    Detail [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on {n}.{n}-ci.{n}, newest promoted is {n}.{n}-ci.{n}. client-b runs {n}.{n}-ci.{n}. A newer compatible build was first promoted {time} ({n} h {n} m ago); the newest is {n}.{n}-ci.{n}. Bound: two CD cycles = {n} h {n} m (progress deadline {n} h {n} m (startup probe {n} s + {n} s + bake window {n} s) × {n} replica(s) = {n} h {n} m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than {n}.{n}-ci.{n} — its self-updater has not announced one (read the instance's {path} and its self-update log) (The action history was cut at its limit, so the lag is a lower bound.) Observed running {n}.{n}-ci.{n}; expected a build no more than {n} h {n} m behind the newest promoted.
    Namespace memex
    Pods memex-portal-deployment-855468d589-tkvnv
    Occurrences 2
    First seen 2026-09-30 08:13:44Z
    Last seen 2026-09-30 08:14:08Z
    Already folded here 14 fingerprint(s)
    Incident Admin/_LogIncident/9f0b1d5d6d00bab1
    Triage called it client-b portal's self-updater still announces no self-update rolls after the #5757 announcement-key fix — stuck on ci.9606, 22h+ behind the newest promoted build
    What triage wrote about this fingerprint

    What is failing

    The client-b portal instance's self-update path is dead: since it was rolled manually to 3.0.0-ci.9606 on 2026-09-29, its self-updater has announced no self-update Roll for any newer build, while the newest promoted compatible build is 3.0.0-ci.9672 — 22 h behind, past the two-CD-cycle staleness bound. The alarm (RollAlarms.StalePortal) is a correct detection; the defect is that client-b's continuous-delivery loop never opens a Roll, so the instance is kept current only by manual rolls, contrary to its Continuous / 3.0.0-ci* update policy.

    Probable cause

    A recurrence of the defect filed as Systemorph/MeshWeaver#5757 (from incident Admin/_LogIncident/40fec26b16f8d914, 2026-09-27). That issue's remedy — declaring announcementKeySecret on Deployments/client-b so client-b announces its own self-updates (MeshWeaver#5757/#5791, record note 2026-09-27) — has never met its stated acceptance: no selfupdate-roll-client-b-* action has ever been opened; every client-b roll in Ops/Actions is manual (2026-09-21, 2026-09-26, 2026-09-29). Meanwhile the fleet-wide pipeline is demonstrably healthy: memex, memex-cloud and build each opened self-update Rolls for ci.9663/9665/9672 within hours of promotion. Confidence medium-high that the fault is client-b-specific and in the announcement/acceptance half of its self-update path — most likely the instance-side key was never pasted and verified on client-b (Settings ▸ Control lane ▸ Test connection, per the record's own acceptance note), or the announcement path still fails on this instance; the evidence here cannot distinguish those, so start with client-b's own Admin/UpdatePolicy and self-update log, which the alarm names as the unread sources of truth.

    Impact

    One customer portal (ClientB) runs builds up to 66 revisions behind the newest promoted, delivered only by operator intervention; no serving outage, no data loss. 2 occurrences on one control-instance pod — the low count reflects the alarm's raise-once-per-condition design, not a mild condition. Workaround exists (manual Roll), and it is what is currently being used.

    Where to look

    1. client-b's own Admin/UpdatePolicy node and self-update log — confirm the policy is Continuous / 3.0.0-ci* and whether the announcement check runs and fails, or never runs.
    2. The acceptance step of the 2026-09-27 record change — Deployments/client-b (announcementKeySecret note): was the key issued, pasted on client-b, and did Test connection succeed?
    3. Ops/Actions/verify-5757-client-b-20260927-selfupdate-latest — the verification action run against #5757 on 2026-09-27.
    4. The alarm implementation for reference: RollAlarms / FleetWatch (Hosting/Issue/Source/FleetWatch, AlarmsOf → RollAlarms.StalePortal).

    Already known: this is the same defect as Systemorph/MeshWeaver#5757 (same alarm site, same instance, 2026-09-27, at that time 21 builds behind). That ticket's fix did not restore client-b's self-update loop; a maintainer may prefer to reopen/continue #5757 rather than track a new issue.

    Still occurring: 2 more since the last update (2 total).

    • Last seen: 2026-09-30 08:14:08Z
    • Pods: memex-portal-deployment-855468d589-tkvnv
    Recent log lines
    2026-09-30 08:13:44Z memex-portal-deployment-855468d589-tkvnv fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on 3.0.0-ci.9606, newest promoted is 3.0.0-ci.9672. client-b runs 3.0.0-ci.9606. A newer compatible build was first promoted 2026-09-29 10:13:05Z (22 h 0 m ago); the newest is 3.0.0-ci.9672. Bound: two CD cycles = 22 h 0 m (progress deadline 3 h 40 m (startup probe 10800 s + 600 s + bake window 1800 s) × 3 replica(s) = 11 h 0 m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than 3.0.0-ci.9606 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) (The action history was cut at its limit, so the lag is a lower bound.) Observed running 3.0.0-ci.9606; expected a build no more than 22 h 0 m behind the newest promoted.
    2026-09-30 08:14:08Z memex-portal-deployment-855468d589-tkvnv fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on 3.0.0-ci.9606, newest promoted is 3.0.0-ci.9672. client-b runs 3.0.0-ci.9606. A newer compatible build was first promoted 2026-09-29 10:13:05Z (22 h 0 m ago); the newest is 3.0.0-ci.9672. Bound: two CD cycles = 22 h 0 m (progress deadline 3 h 40 m (startup probe 10800 s + 600 s + bake window 1800 s) × 3 replica(s) = 11 h 0 m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than 3.0.0-ci.9606 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) (The action history was cut at its limit, so the lag is a lower bound.) Observed running 3.0.0-ci.9606; expected a build no more than 22 h 0 m behind the newest promoted.
    
  22. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by systemorph-com[bot] on 2026-10-04)

    Still occurring: 1 more since the last update (3 total).

    • Last seen: 2026-10-04 22:02:41Z
    • Pods: memex-portal-deployment-855468d589-tkvnv, memex-portal-deployment-67c67b456d-s7nt9
    Recent log lines
    2026-09-30 08:13:44Z memex-portal-deployment-855468d589-tkvnv fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on 3.0.0-ci.9606, newest promoted is 3.0.0-ci.9672. client-b runs 3.0.0-ci.9606. A newer compatible build was first promoted 2026-09-29 10:13:05Z (22 h 0 m ago); the newest is 3.0.0-ci.9672. Bound: two CD cycles = 22 h 0 m (progress deadline 3 h 40 m (startup probe 10800 s + 600 s + bake window 1800 s) × 3 replica(s) = 11 h 0 m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than 3.0.0-ci.9606 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) (The action history was cut at its limit, so the lag is a lower bound.) Observed running 3.0.0-ci.9606; expected a build no more than 22 h 0 m behind the newest promoted.
    2026-09-30 08:14:08Z memex-portal-deployment-855468d589-tkvnv fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on 3.0.0-ci.9606, newest promoted is 3.0.0-ci.9672. client-b runs 3.0.0-ci.9606. A newer compatible build was first promoted 2026-09-29 10:13:05Z (22 h 0 m ago); the newest is 3.0.0-ci.9672. Bound: two CD cycles = 22 h 0 m (progress deadline 3 h 40 m (startup probe 10800 s + 600 s + bake window 1800 s) × 3 replica(s) = 11 h 0 m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than 3.0.0-ci.9606 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) (The action history was cut at its limit, so the lag is a lower bound.) Observed running 3.0.0-ci.9606; expected a build no more than 22 h 0 m behind the newest promoted.
    2026-10-04 22:02:41Z memex-portal-deployment-67c67b456d-s7nt9 fail: FleetWatch[0]
          [FleetWatch] roll alarm StalePortal on client-b: client-b: Stale portal — still on 3.0.0-ci.9887, newest promoted is 3.0.0-ci.9949. client-b runs 3.0.0-ci.9887. A newer compatible build was first promoted 2026-10-04 00:01:37Z (22 h 0 m ago); the newest is 3.0.0-ci.9949. Bound: two CD cycles = 22 h 0 m (progress deadline 3 h 40 m (startup probe 10800 s + 600 s + bake window 1800 s) × 3 replica(s) = 11 h 0 m per roll). Blocking: no self-update Roll was opened for client-b for any build newer than 3.0.0-ci.9887 — its self-updater has not announced one (read the instance's Admin/UpdatePolicy and its self-update log) (The action history was cut at its limit, so the lag is a lower bound.) Observed running 3.0.0-ci.9887; expected a build no more than 22 h 0 m behind the newest promoted.
    
  23. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-08)

    2026-10-08 ~19:00Z: today's StalePortal on build has a named cause. build hands each new build to the OLD control inbox, which answers 404

    This covers the newest fold here, 64e7c0118e478776 (build on 3.0.0-ci.10150, 22 h behind). Readings were taken with governed Logs actions and read-only reads.

    1. build detects every new build and hands it over, and every hand-over fails with 404. Ops/Actions/verify-5757-build-20261008-selfupdate on memex.systemorph.com read {namespace="build"} |~ "(?i)(SelfUpdate)|(OciTagLister)|(ControlInbox)|(control-lane)" over 15:49–18:49Z: 42 lines read, 42 landed, 0 failed, not truncated. The pod memex-portal-deployment-584c896459-vln7x (image 3.0.0-ci.10150, booted 15:40:37Z) repeats the same cycle for 3.0.0-ci.10256, …10257 and …10259:

    • [SelfUpdate] handing 3.0.0-ci.10259 to the control lane (https://memex.systemorph.com/…)
    • [SelfUpdate] the hand-over of 3.0.0-ci.10259 to the control lane FAILED; the next check announces it again.
    • SelfUpdateHandoverRejectedException: the control inbox at https://memex.systemorph.com/api/hooks/Hosting/PlatformBuilds answered 404 Not Found (Ops/Logs/build-1791484912563511921-896459-vln7x, 18:41:52Z)

    So the self-updater is NOT silent here. It announces, and nobody accepts the announcement.

    2. memex.systemorph.com no longer accepts Hosting/PlatformBuilds. Ops/Actions/verify-5757-control-20261008-inbox read {namespace="memex"} |~ "(?i)(PlatformBuilds)|(WebhookInbox)|(ControlInbox)|(SelfUpdateRouting)" over 16:51–18:51Z. It was CUT at 200 lines, so the counts below are a floor:

    • 88 × Webhook for unknown/refused target 'Hosting/PlatformBuilds' dropped (WebhookInboxEndpoints, warn).
    • memex's own self-updater hands to the NEW lane: [SelfUpdate] handing 3.0.0-ci.10259 to the control lane (https://control.systemorph.com/api/hooks/Hosting/PlatformBuilds).

    3. The new control instance rolls the instances that point at it, and build is not among them. On control.systemorph.com, namespace:Ops/Actions id:selfupdate-* sort:createdDate-desc shows a Roll per build for memex and control all day (ci.10245 → ci.10264; the newest is selfupdate-roll-control-3-0-0-ci-10264-38c678b9, 18:52Z). content.deployment:Deployments/build on control returns 0, untruncated. On memex.systemorph.com, no selfupdate-* action has been created since 2026-10-07 ~17:17Z. That is expected after the move to the new instance, not a stall: routed actions now live on control.systemorph.com.

    4. The record already has the fix; the pod does not. Deployments/build v83 (lastModified 2026-10-08T16:30:59Z, system-security) declares extraPortalConfig.Hosting__ReportTo: https://control.systemorph.com. The serving pod booted 15:40Z, before that change, and still uses the old inbox. Nothing has applied the record since: there is no Reconcile or Roll for Deployments/build on either control instance today. memex-cloud's record change, by contrast, produced record-reconcile-memex-cloud-v1-… (11:32Z) and …-v2-… (17:54Z) on control.systemorph.com.

    What closes the build shape: apply record v83 to build (a governed Reconcile of Deployments/build, then confirm the boot line hands to https://control.systemorph.com/… and a selfupdate-roll-build-… appears on control.systemorph.com). I did not file that Reconcile. It is a deploy on an instance the record says retires at the operations cutover, and it needs an approval.

    Not established

    • Why no record-change Reconcile was planned for build when v83 landed, while one was planned for memex-cloud. That could be a gap in the record-change reconcile, or build being excluded because it is retiring. I did not read RecordChangeReconcile's decision lines.
    • Which senders account for the 88 drops. The drop line names no sender, and build's own log shows only 3 hand-overs in that window, so others (client-b?) are probably also still pointed at memex.systemorph.com. ClientB's record (Deployments/client-b v118) was not read.
    • build also reports nodetype_bake: … 18 failed with no working build to regress from — Hosting/Backup, Hosting/BugFixPool, … Hosting/InstanceAction, … (Ops/Status/build, 18:47Z). That is unrelated to the hand-over and not investigated.

    On this issue's scope: it is now the fold target for the FleetWatch roll-alarm log site b164c7a435ab60de (27 fingerprints: StalePortal on memex-cloud/control/memex/client-b/build, StuckRoll on build/memex, BabysitterDrift, RollUnobserved). These are different causes under one log site. This comment answers only the newest one.

  24. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-11)

    (re-posted 2026-10-11; originally by @rbuergi on 2026-10-09)

    Verified on production 2026-10-09 ~14:25Z (control instance, control.systemorph.com). Closing for the build half. The client-b half was not re-measured here; see the last bullet.

    What was checked:

    • The values half exists and is applied. Ops/Actions/provision-build-20261009-values-half is Done, and its operator run concluded success (Memex run 37896239954, 17/17 steps). Step 8 read vault helm-values-build (633 bytes, families only) and applied helm revision 5. Ops/Actions/reconcile-build-20261009-after-values-half is also Done (run 37896741693, 15/15 steps, revision 6). Its hosting-kv-synced step reported all 9 declared key(s) are in their synced Secret(s), including Hosting__ControlInbox__Secret.
    • build announces to control, and control rolls it. Control now holds self-update actions with origin: self-update and isRouted: true. Each reason reads "build announced … — routed from the control inbox (MeshWeaver#4098)". Denominator: 6 roll actions for build on 2026-10-09 (ci.10300, 10305, 10308, 10310, 10319, 10322) plus 1 Restart.
      • The newest that landed is Ops/Actions/selfupdate-roll-build-3-0-0-ci-10319-05d0cc8c. Its reason says "build announced that 3.0.0-ci.10319 is available (running 3.0.0-ci.10310)", trigger SafetyNet. State is Done: migration Version: 60, helm revision 10, 3/3 ready … running cr.meshweaver.cloud/memex-portal-ai:3.0.0-ci.10319.
      • https://build.meshweaver.cloud/api/version returns commit 9704e993f50c.
      • The build-side defect this issue describes ("no self-update Roll was opened") is therefore gone. build went from ci.10150 (07:00Z) to ci.10319 (14:09Z) by its own announcements.
    • Not established:
      • I did not read build's boot line apply=control-lane directly (no log query was run). The routed actions above are the evidence instead.
      • The newest announcement, ci.10322 (selfupdate-roll-build-3-0-0-ci-10322-e2fcb389), failed at mirror. meshweaver.azurecr.io/memex-portal-ai:3.0.0-ci.10322 does not exist, because the announced set has no published portal image. That is a separate defect: an unsealed or unpublished set is admitted. It is not this issue.
      • build /health reads Degraded. The ci.10322 announcement cites a failed MeshWeaver.AI live swap (HttpClient factory already has a registered client with the name 'WebSearchPlugin').
      • client-b was not re-measured: control and client-a-control hold no client-b actions. If client-b is still stale, reopen with its reading.
  25. rbuergi commented on Oct 11, 2026

    @rbuergi
    ContributorAuthor

    Re-measured 2026-10-11 ~19:50Z — the original defect is gone on our own instances; two portals remain, and neither needs a code change

    The instances in this issue now roll themselves. On the control instance, Ops/Actions holds a self-update Roll for every promoted build today, opened by self-update with no human request:

    • build: selfupdate-roll-build-3-1-10535, …-10537, …-10548, …-10553 and …-10560.
    • memex, memex-cloud and control: the same, up to 3.1.10565.

    build, the 7-day-stale portal in the title, last rolled to 3.1.10560 at 18:56Z.

    Two portals are still behind. I separated opened but unapproved (an owner act) from never opened (a defect).

    1. A customer portal — opened, awaiting approval (owner act)

    • The roll Ops/Actions/roll-<customer>-20261011-3-1-10502-b exists: requested 06:05Z, state AwaitingApproval. It needs "a global administrator other than the requester (or the maintainer)" to approve it.
    • The portal's own Admin/UpdatePolicy explains why its self-updater never opened one. It runs 3.0.0-ci.9887, which predates both of these:
      • the SemVer-era ordering (PlatformReleaseOrder, 3.1.<run> above every 3.0.0-ci.*). Under pattern: 3.* it still selects 3.0.0-ci.10350 as newest.
      • a usable control lane. The verdict says "detect-and-notify … Hosting:ControlInbox:Secret is empty, so nothing could be signed". The record declares announcementKeySecret, so the route is a per-deployment announcement key, not the fleet inbox secret.
    • Current code orders these tags correctly (PlatformReleaseOrderTest, 3.1.10000 > 3.0.0-ci.9999), so there is nothing to fix in code. The portal cannot reach that code without the roll.
    • Acts:
      1. a second global administrator approves the open roll;
      2. after it, the portal's administrator issues and pastes the announcement key (/Admin/Settings/ControlLane) and a control administrator registers it (Doc/Architecture/SelfUpdateAnnouncementKey). Only then can its next promoted build open a Roll by itself.

    2. An estate's test instance — never opened, by the defect #6480 fixed (owner act to deliver it)

    • Its Admin/UpdatePolicy at 18:54Z: "HOLDING 3.1.10558 — the framework identity of release 3.1.10558 is not resolvable — no content bake has been published for it".
    • That is exactly the registry-fed-root defect fix(self-update): a registry-fed root learns a release's identity from the registry #6480 fixed (merged 13:03Z). The instance runs 3.1.10524, built from CD run 10524 at 11:52Z, before the fix. Its own gate therefore holds every release and never announces one, so no Roll is opened.
    • A Restart was filed on its estate control instance at 14:47Z with the reason "bring the instance onto platform 3.1.10533". A Restart pulls no image (the plan says "Restart pulls no image"), so the instance is still on 3.1.10524. That Restart is still Running / Verify one generation (observed until 22:41Z), and while it is open it also holds the routing lane.
    • Act: a governed Roll (not a Restart) of that instance to a build at or after 3.1.10533, approved on its estate control instance. Its own self-updater takes over from that build on.

    What I did not establish

    • Whether the customer portal's announcement key exists at all — the record page shows that, and I did not open it.
    • That the rolled test instance then announces by itself — it can only be read after the roll.

    Keeping this open until both portals are on a 3.1.x build and have each opened one Roll on their own.

  26. rbuergi commented on Oct 13, 2026

    @rbuergi
    ContributorAuthor

    Re-measured 2026-10-13 ~15:10Z. The code defect stays gone. One portal is still stale, and only an owner act can move it.

    • Our own instances roll themselves. /api/version: build on 70362c45ac, memex and memex-cloud on ec7763883b, control on 3182d81399. Every one is a 3.1.x build. Ops/Status/memex shows self_update: … update available: 3.1.10729 — handed to the control lane … accepted (200).
    • The customer portal is still on 3.0.0 (/api/version commit 1bafcb2852). The roll opened for it on 2026-10-11, Ops/Actions/roll-<customer>-20261011-3-1-10502-b, was never approved. At 2026-10-12 15:41Z it was retired: state: Refused — stale — … waited for an approval since 2026-10-11T06:05:01Z, longer than 24 h … Re-request it if it is still wanted. Until that portal runs a 3.1.x build, it cannot open a Roll by itself, as the previous comment explains.
    • The estate test instance was not re-measured. Its control instance is not reachable from this session.

    Owner act:

    1. Re-request the customer portal's Roll on the control instance, against the current 3-latest tag.
    2. A global administrator other than the requester approves it within 24 h.
    3. Then the portal administrator issues the announcement key (/Admin/Settings/ControlLane), and a control administrator registers it.

    This stays open until the portal has opened one Roll on its own.

  27. rbuergi commented on Oct 16, 2026

    @rbuergi
    ContributorAuthor

    State 2026-10-16: the self-updater defect is fixed on main. What is left is owner acts, not code.

    Fixed on main (traced from trigger to hand-over at 746e341d4e):

    • Instances that never announced a release: be5d157273, 9d7b04e473, 4459c97e41.
    • 3.0.0-ci.* ranked above 3.1.x: 4a6dfec6fe, 02f827d89b.
    • The record's update policy and pattern now decide: f0a0a35561.
    • An unresolvable framework identity no longer holds the release: 79d2cf41d8, 187b790ac9.
    • Package availability is now advisory and never holds the platform roll: 6c587469be.
    • The gate reads each source's live publication: b95b896b48.

    In production: the platform's own instances roll themselves. On control, Ops/Actions has a self-update Roll per promoted build (3.1.11001–3.1.11004) for build, control, memex and memex-cloud, opened by self-update with no human request.

    Still stale: one customer portal. It reads 3.0.0+1bafcb2852. Its record now declares updatePattern: 3.*, and the Reconcile that applied it is Done. But a Reconcile pulls no image, so the pod still runs pre-fix code that can't select or announce a 3.1 build. It needs one governed Roll from outside:

    • the 2026-10-11 Roll was never approved and expired;
    • the 2026-10-12 record-page Roll failed at Plan with "no image tag — name one on the request (imageTag) or pin one on the record".

    Closes when:

    1. A Roll for that portal is requested with an explicit imageTag, a current 3.1.x, and a second global administrator approves it within 24 h.
    2. The portal's administrator issues its announcement key (/Admin/Settings/ControlLane), and a control administrator registers it.
    3. After that, the portal opens its next Roll itself: a selfupdate-roll-… action opened by self-update with no human request, and its /api/version reads a 3.1 build.
  28. rbuergi commented on Oct 20, 2026

    @rbuergi
    ContributorAuthor

    Re-measured 2026-10-20 ~12:40Z. The instances in the title are fixed. One customer instance still cannot announce, and Systemorph/MeshWeaver.Plugins#3858 is the fix. It was a draft and is now ready.

    Fixed: the instances in the title.

    • /api/version on build, memex (public), control and memex (company) reads ee1d4eeb27, which is main~1.
    • On control, Ops/Actions holds a selfupdate-roll-<id>-3-1-<run> for every promoted build (3.1.11242 … 3.1.11282). Each was opened by self-update for build, control, memex, memex-cloud and one customer instance. No person requested any of them.

    Still open: one customer instance (the one this thread called "the customer portal").

    • It was hand-rolled to 3.1.11217 on 2026-10-19 (governed Roll, Done). Since then, no selfupdate-roll-<id>-* exists for it (search on Ops/Actions: 0 rows).
    • Ops/Status/<id>: 9 of 9 replicas say self_update: … update available: 3.1.11282 (detect-and-notify — … Hosting:ReportTo names the control instance but Hosting:ControlInbox:Secret is empty, so nothing could be signed).
    • Detection works: the registry pairing, the 3.* pattern, Continuous and MinRollInterval 01:00:00 are all rendered. Only the hand-over has no key.

    Root cause.

    • The record declares announcementKeySecret and Hosting__ReportTo, but maps no Hosting__ControlInbox__Secret. The roll's actionPlan.renderedValues confirm that no such mount was rendered.
    • Rule 4 of Doc/Architecture/SelfUpdateAnnouncementKey: a record that declares its own key cannot announce with the fleet secret. So the instance has no route at all.
    • The other customer instance, which does roll, maps the key explicitly on both its own record and control's.
    • That doc page (updated 2026-10-17) says both mounts are DERIVED by AnnouncementKeyMounts. That derivation existed only in the draft Plugins#3858. Both of its preconditions merged on 2026-10-17: hosting-kv-ensure: --generate / --generate-only — create the self-update announcement key when absent #6917 and Systemorph/Memex#774.

    What I did.

    After it deploys.

    • The record-change router opens a Reconcile for the customer instance and one for control. Each runs hosting-kv-ensure --generate-only first.
    • The instance's next check should then hand its build to the control lane, and CD should open selfupdate-roll-<id>-….
    • Recycle after deploy (on control): the Hosting/PlatformBuildInbox hub, and the Hosting/InstanceAction and Hosting/Deployment NodeTypes.

    This closes when that instance has opened one self-update Roll on its own.

    Not established:

    • Whether control already holds a portal-registered announcement key for that deployment. One would take precedence over the derived mount. The Admin InstanceSecret search returned 0 rows, but that may be RLS.
    • That the vault object exists. The PR's ensure step creates it if it is absent.

    The related issues are separate defects, not this one:

  29. rbuergi commented on Oct 27, 2026

    @rbuergi
    ContributorAuthor

    Closing: every live instance now opens its own Roll for each newer promoted build. Re-measured 2026-10-27 ~11:20Z, read-only, on the control instance (https://control.systemorph.com/Ops/Actions) and on the estate control instance.

    The closing condition (20 Oct comment) was that the remaining customer instance opens one self-update Roll on its own. It has, since 21 Oct, and every other instance does too:

    instance self-update Rolls opened by self-update (newest) state
    build (the 7-day-stale portal in the title) selfupdate-roll-build-3-1-11792-c19fec19, also 11789, 11786, 11784 today rolling per build
    memex, memex-cloud, control selfupdate-roll-{memex-3-1-11798, memex-cloud-3-1-11792, control-3-1-11801}-… rolling per build
    the customer instance from the 13 Oct / 16 Oct / 20 Oct comments selfupdate-roll-<customer>-3-1-11792-…: state: Done, origin: self-update, isRouted: true, reason "announced that 3.1.11792 is available (running 3.1.11789), policy Continuous, pattern 3., … routed from the control inbox (MeshWeaver#4098)"*. Its first self-announced Roll was …-3-1-11331-… on 2026-10-21. Before that, every Roll was a manual one (the last on 2026-10-20). fixed by MeshWeaver.Plugins#3858 (merged 2026-10-20T15:17Z)
    the estate test instance from the 11 Oct comment (on its own estate control instance) selfupdate-roll-<estate>-test-3-1-11789-…, plus one roughly every hour back to 00:28Z rolling per build

    The control instance holds six Hosting/Deployment records. Five are covered above. The sixth record is status: Suspended (teardown decided 2026-10-20), and its self-updater is meant to be off.

    Not established:

    • I did not read each instance's /api/version. The Done state on the routed Rolls is the evidence.
    • FleetWatch's StalePortal alarm: I did not run a Logs query for it (this was a read-only pass). If it fires again for a live instance, reopen with that reading.
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

    bugSomething isn't workingsev:MMedium - secondary path broken, or easy workaround

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions