Skip to content

NodeType recycle cascade gives up on instance enumeration when its captured DI scope is already disposed, leaving instance hubs on stale builds #5099

Closed

Description

@systemorph-com

What is failing

The new node-type recycle cascade (see Recycling a node type now recycles everything built on it) tried to recycle the NodeType Hosting/TriageItem and could not: when it tried to enumerate the type's live instance hubs, the Autofac LifetimeScope behind the service provider had already been disposed (ObjectDisposedException thrown from AutofacServiceProvider.GetService). The cascade aborted that leg, recycled 0 addresses, and left the type's live instance hubs serving the assembly they were born with — they must now be recycled by hand. This is the new "one wave" feature silently not reaching the instances it was built to reach.

Probable cause

Use-after-dispose of a captured DI scope inside the cascade. The sibling incident 8bd12828ac02105b captured the same burst with a full stack: the enumeration is a lazy lambda in NodeTypeRecycleCascade.DependencyNetwork (MeshWeaver.Graph/Configuration/NodeTypeRecycleCascade.cs ~line 223) that resolves through MeshService.Query<T> (MeshWeaver.Hosting/MeshService.cs ~line 307) via SubscribeScopedObservable (MeshWeaver.Messaging.Hub/ImpersonationScopeExtensions.cs ~line 210). By the time the deferred enumeration runs, the scope has been disposed — most likely because an earlier leg of the same recycle wave tore down the hub whose scope the enumeration was capturing. High confidence (~80%): the exception is thrown by the DI container itself, ruling out a data-layer error, and it fired exactly during the cascade.

Impact

Low so far — a single occurrence today on one pod. But it is functional, not noise: instance hubs of the affected type keep stale activations until manually recycled, which is precisely the stale-state problem the cascade feature was shipped to eliminate. If it recurs on every large recycle, stale hubs accumulate silently.

Where to look

  • MeshWeaver.Graph/Configuration/NodeTypeRecycleCascade.cs — DependencyNetwork, the lazy instance-enumeration lambda (~line 223).
  • MeshWeaver.Hosting/MeshService.cs — Query<T> (~line 307) resolving from a possibly-disposed AutofacServiceProvider.
  • MeshWeaver.Messaging.Hub/ImpersonationScopeExtensions.cs (~line 210), where the scoped observable defers resolution.

Fix direction: enumerate the live instances eagerly (before any hub teardown the wave itself triggers), or catch ObjectDisposedException and re-resolve against a live scope instead of reporting the leg INCOMPLETE and giving up.

Duplicates / related

Sibling incident Admin/_LogIncident/8bd12828ac02105b is the same failure 1 ms earlier at the same log site (the enumeration-failed detail message vs. this cascade-summary message) — a human should merge the two tickets. Possibly the same disposed-scope family as incidents 0857ac25 (HostedHubsCollection), 04ba38cd (LayoutAreaHost rendering), 03a2... dispose-discard messages.


Evidence

Fingerprint d3faa573fbb24ab8
Category MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade
Severity Error
Namespace memex
Pods memex-portal-deployment-75b545bbd-gwrc6
Occurrences 1
First seen 2026-09-21 08:05:16Z
Last seen 2026-09-21 08:05:16Z
Routing not determined — no configured route matches the category MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade. 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-21 08:05:16Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
      [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled

Opened automatically from Admin/_LogIncident/d3faa573fbb24ab8. Recurrences are folded into this issue rather than opening new ones.

Activity

  1. systemorph-com commented on Sep 21, 2026

    @systemorph-com
    ContributorAuthor

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

    • Last seen: 2026-09-21 08:07:20Z
    • Pods: memex-portal-deployment-75b545bbd-gwrc6
    Recent log lines
    2026-09-21 08:05:16Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:07:20Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    
  2. systemorph-com commented on Sep 21, 2026

    @systemorph-com
    ContributorAuthor

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

    • Last seen: 2026-09-21 08:11:08Z
    • Pods: memex-portal-deployment-75b545bbd-gwrc6
    Recent log lines
    2026-09-21 08:05:16Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:07:20Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:11:08Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    
  3. systemorph-com commented on Sep 21, 2026

    @systemorph-com
    ContributorAuthor

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

    • Last seen: 2026-09-21 08:16:23Z
    • Pods: memex-portal-deployment-75b545bbd-gwrc6
    Recent log lines
    2026-09-21 08:07:20Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:11:08Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:16:23Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    
  4. systemorph-com commented on Sep 21, 2026

    @systemorph-com
    ContributorAuthor

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

    • Last seen: 2026-09-21 08:46:00Z
    • Pods: memex-portal-deployment-75b545bbd-gwrc6
    Recent log lines
    2026-09-21 08:11:08Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:16:23Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:46:00Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    
  5. systemorph-com commented on Sep 21, 2026

    @systemorph-com
    ContributorAuthor

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

    • Last seen: 2026-09-21 08:50:58Z
    • Pods: memex-portal-deployment-75b545bbd-gwrc6
    Recent log lines
    2026-09-21 08:46:00Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:50:32Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    2026-09-21 08:50:58Z memex-portal-deployment-75b545bbd-gwrc6 fail: MeshWeaver.Graph.Configuration.NodeTypeRecycleCascade[0]
          [RecycleCascade] Hosting/TriageItem: the recycle is INCOMPLETE. 0 address(es) were recycled, but 1 enumeration leg(s) could not be read, so an unknown number of live hubs keep serving the assembly they were born with and must be recycled by hand: the instances of 'Hosting/TriageItem' could not be enumerated (ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed.), so its live instance hubs are NOT recycled
    
  6. rbuergi commented on Sep 21, 2026

    @rbuergi
    Contributor

    Consolidation 2026-09-21 — 2 tickets folded here

    Folded as duplicates: #5100 #5123. Three incidents, one defect: the cascade's captured Autofac LifetimeScope is disposed by the cascade's own wave, so the deferred instance-enumeration lambda throws ObjectDisposedException and those legs recycle nothing.

    Mechanism, from #5123: recycling the first N addresses tears down hubs; once one of them owns the shared scope the remaining legs resolve through, every subsequent leg fails. So the failure is worse the larger the wave — the opposite of what an operator would assume. Measured: Hosting/Deployment broke down after 10 of 21 legs, leaving 11 (Hosting/Deployment, Hosting/Backup, Hosting/DeploymentStatus, Hosting/FleetConsole, Hosting/InstanceAction, Hosting/InstanceRequest, ~5 more) unrecycled and serving their birth assembly instead of release 3019 (ecda297ebe9a4cc492b431681ffb8747).

    Trigger: the burst fired right after the 08:52Z release request — self-update waves over the Hosting/* tree — and that tree is exactly what an operator uses to observe and drive a roll.

    Why this is sev:H: recycle-after-deploy is the mandated last step of a change set and the only surface that makes a running activation re-read its configuration. This defect makes that remedy silently partial: the cascade reports its work, recycles 0 (or 10 of 21) addresses, and the instance hubs keep serving the old assembly. A primary path is broken and the workaround — recycling each instance by hand — exists but requires knowing which legs aborted. Not raised beyond H: the aborts are logged at fail level, so it is not wholly silent, and there is no evidence yet of a user-visible wrong answer.

  7. added
    area:meshCore subsystem: the mesh - nodes, partitions, addressing, activation
    sev:HBLOCKING: primary path broken, intermittent user-visible failure, or silently wrong results.
    on Sep 21, 2026
  8. rbuergi commented on Sep 22, 2026

    @rbuergi
    Contributor

    Fixed in #5163 — not closing: sev:H closes on production verification, never on a merge

    Root cause, and it is not quite what the issue proposed

    The issue's "probable cause" was right about the family and about the file, and it named the fix direction as "enumerate the live instances eagerly (before any hub teardown the wave itself triggers), or catch ObjectDisposedException and re-resolve". The first was already done and is why the bug was confusing; the second would not have worked.

    MessageHub.HandleDispose runs the RecycleCascade seam and then calls Dispose(), on the stated reasoning that the network is derived "while this hub is still whole enough to compute it". That holds for the derivation's synchronous prologue and for nothing after it:

    • DependencyNetwork resolved its three services eagerly, in that prologue — the "enumerate eagerly" remedy, already in the code;
    • but each enumeration leg is a cross-hub query, composed as Concat, so the later legs subscribe on a pool thread after Dispose() completed and HostedHubsCollection.CloseScopeWhenDisposed closed the hub's Autofac scope.

    There is no race to lose — by construction the later legs run against a dead scope.

    Why hoisting could not fix it, which is the transferable part. IMeshService is registered AddScoped (PersistenceExtensions.cs:720, :797), i.e. per hub. The eagerly-captured MeshService holds the dying hub and reaches back through it on every Query<T>: StampViewer → CaptureContext() → hub.ServiceProvider.GetService<AccessService>() (MeshService.cs:98, from :347). So hoisting relocates the throw into the service's own body, where no call-site hoist can reach it. Doc/Architecture/DisposedScopeAndDyingHubs R3 (merged in #5159) prescribes "hoist, never guard" on the explicit premise of mesh-lifetime singletons — true there, and not true here.

    The fix

    DependencyNetwork enumerates through the mesh's read-issuing hub (MeshExtensions.ReadIssuingHub), a survivor: hosted by the mesh hub so the definition hub's teardown cannot touch it, off the router, and not the node-CRUD execution hub, so these reads are not queued behind every write in flight. The cascade already applied "issue it from a survivor" to its outbound DisposeRequests; this is the read half it had missed.

    Control, both sides

    ARecycleCascadeEnumeratesFromASurvivorTest — 3 cases:

    with the fix with var reader = hub restored
    failed 0 / 3 2 / 3

    Both failures cite this issue's own string verbatim: ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed. One arrives as 2 Incomplete legs (the production shape: composed while the hub is whole, subscribed after it died), one thrown synchronously (called after it died). The case that passes on the broken build is the calibration case (hub alive) — which is what shows the other two are not failing for an unrelated reason.

    Two things keep them from going vacuous: the precondition is asserted (a resolve from the dead hub must throw, so a change in scope-closing order cannot make the cases pass having exercised nothing), and every case asserts the instance path is in the network rather than that the answer is merely "complete" — an empty network is complete too, and "complete, 0 addresses" for every input is the silent form of this very defect.

    On the duplicate

    The issue asks for Admin/_LogIncident/8bd12828ac02105b to be merged with this one. Agreed — same failure 1 ms earlier at the same log site: that is the per-leg Enumerating the instances of {Type} failed line, this is the cascade summary. One defect, one fix.

    What closing this needs

    A roll, then against the running portal:

    1. recycle a NodeType definition that has live instances (Hosting/TriageItem is this incident's own type);
    2. confirm the [RecycleCascade] line reports a complete cascade with a non-zero address count, and no ObjectDisposedException in any leg detail.

    I have not rolled anything and cannot — live portals are read-only to me. Leaving this open for that verification.

  9. rbuergi commented on Sep 22, 2026

    @rbuergi
    Contributor

    Status: the fix (#5163) is on the running image. The positive verification is still owed

    • fix(mesh,hosting): a recycle and a bake must ask a survivor, not the thing that is dying (#5099, #5073) #5163 (7a39fb2412, merged 2026-09-22 03:53Z) is contained in 3da3423c4b. That is what memex.systemorph.com and memex.meshweaver.cloud both answer on /api/version now.
    • On current main, NodeTypeRecycleCascade.DependencyNetwork resolves IMeshService/AccessService from the mesh's read-issuing hub (hub.GetMeshHub().ReadIssuingHub()), a survivor, rather than from the dying definition hub. This is the correct answer to the "hoisting a per-hub-scoped service holds the dying hub" trap. ARecycleCascadeEnumeratesFromASurvivorTest pins it: 2 of 3 red with the old reader, per the comment above.
    • No recurrence has been folded since 2026-09-21 08:50:58Z. That absence is not evidence. This leg only fires on a NodeType recycle with live instances, and the bot also reported nothing on the pre-fix image between 09-21 08:50Z and the 09-22 roll.

    Not done: the closing read. Recycle Hosting/TriageItem on the control instance, then confirm a [RecycleCascade] … address(es) in its dependency network line with a non-zero count and no ObjectDisposedException leg. I could not reach the control instance's MCP this session (503), and a recycle is a live-portal write that should come from the operator.

  10. rbuergi commented on Sep 23, 2026

    @rbuergi
    Contributor

    Status 2026-09-23 ~18:20Z: no change. The fix (#5163) is live and the positive read is still owed

    The closing act (unchanged, the operator's): once memex has converged, recycle the NodeType Hosting/TriageItem, then read the portal log (Logs InstanceAction, sinceMinutes covering the recycle) and confirm two things:

    1. a [RecycleCascade] Hosting/TriageItem … address(es) line with a non-zero count;
    2. no leg detail that names ObjectDisposedException.

    An INCOMPLETE line means the fix does not hold.

    Not established: nothing new since the 09-22 19:20Z comment. No recurrence has been folded since 2026-09-21 08:50:58Z, and as that comment says, that absence is not evidence.

  11. rbuergi commented on Sep 25, 2026

    @rbuergi
    Contributor

    Triage re-read 2026-09-25 ~15:30Z. Running builds (/api/version): memex.systemorph.com = 39f49494eb (ci.9218), memex.meshweaver.cloud = 140c5fb7ae (ci.9291). Ancestry was checked with git merge-base --is-ancestor against origin/main. Both portals are still held at the V58 migration: the ci.9332 pods crash-loop on DbVersionGate db_version=57 < expected 58. Nothing will roll until a governed Reconcile of Deployments/memex runs the migration Job.

    Status: the fix is deployed, and the verification is still owed. #5163 (7a39fb2412) is contained in both running builds. The closing act is unchanged and is an operator's: recycle the NodeType Hosting/TriageItem on the control instance, then use a Logs read to confirm a [RecycleCascade] … address(es) line with a non-zero count and no ObjectDisposedException leg. I did not do it, because the control instance is mid-stuck-roll.

  12. rbuergi commented on Sep 26, 2026

    @rbuergi
    Contributor

    Post-roll verification, memex.systemorph.com, 2026-09-26 ~05:55Z. memex serves 3.0.0-ci.9332 = core 4028fd6468 (/api/version), Plugins half 1470fbf3 (CD run 9332 portal-ai job HEAD is now at 1470fbf; same ref as the /health publication-seal line). The DB is at V58: memex-migration-63 logged Database migration completed. Version: 58 at 2026-09-25 17:58:03Z. The roll is not converged: Ops/Status/memex at 05:48Z reads 1/3 ready; only 5dbb7df97b-dktrd (booted 04:06:39Z) serves. So every post-roll window below is about 1 h 50 min on one serving replica. All reads are Logs InstanceActions under Ops/Actions/logs-memex-20260926-postroll-*.

    Still open: the closing act was attempted and refused on permission.

    • The fix (fix(mesh,hosting): a recycle and a bake must ask a survivor, not the thing that is dying (#5099, #5073) #5163, 7a39fb2412) is in 4028fd6468.
    • I called the governed recycle MCP tool on Hosting/TriageItem on the control instance and got: Recycle requires Update permission on the target node … Ask someone with write access to the node (or a platform admin) to do it. Nothing was recycled, so there is no [RecycleCascade] line to read.
    • Tool gap, noted: the MCP recycle tool takes no reason argument. A recycle issued through it would therefore log reason not stated by the caller.

    Closing act (owner, someone with Update on Hosting/TriageItem): recycle it, then run a Logs read for RecycleCascade covering the recycle. Look for a non-zero address(es) count and no ObjectDisposedException leg. The roll is not converged (1/3 ready), so prefer to do this after it converges, or the cascade will reach only one replica's activations.

  13. rbuergi commented on Sep 26, 2026

    @rbuergi
    Contributor

    Verified live on memex (ci.9406 = core cdda28d, which carries #5163), 2026-09-26 15:20Z.

    The governed Recycle action Ops/Actions/recycle-memex-20260926-triageitem-5099 (Plugins #2399), maintainer-approved and run as system, recycled NodeType Hosting/TriageItem:

    • [RecycleCascade] Hosting/TriageItem: 180 address(es) in its dependency network: a non-zero count.
    • recycleIncomplete: []: no leg gave up on instance enumeration, which was this issue's failure.
    • recycled 'Hosting/TriageItem': the dispose was posted and a FRESH activation answered a read (version 5716).
    • State Done, 8/8 steps.

    That meets the closing condition in the triage comment: a non-zero address count with no incomplete leg. Closing.

    Not established: I did not run a separate Loki read for an ObjectDisposedException around 15:20Z. The action's own enumeration completing with no lost leg is the evidence.

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

    area:meshCore subsystem: the mesh - nodes, partitions, addressing, activationbugSomething isn't workingfeature:recycle-cascadesev:HBLOCKING: primary path broken, intermittent user-visible failure, or silently wrong results.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions