Skip to content

A hub activated on the wrong NodeType stays wrong — fixing resolution does not un-pin it #1104

Closed

Description

@rbuergi

Found while fixing #1077. This is the defect that intermittently reds PRs whose diffs cannot reach it, and it currently blocks PR #1103.

What happens

The plugins gate fails on Store/Catalog with compile=Ok render=ok tests=FAILED, "No renderer is registered for area Tests on hub Store".

The decisive evidence is the available-areas list in the failure: it is, item for item, ConfigureDefaultNodeHub's set (AddDefaultLayoutAreas + Education + Domain areas + Invite) — and not one area from Store/Catalog's compiled configuration. Hub Store was serving the mesh default configuration rather than its own.

Two hypotheses are ruled out by the same run, which printed which node hosted each Tests run:

Type Host Result
Store/Catalog Store — instance already in the mesh FAILED
Store/Enrollment, Store/Provision …/GateProbe — probe the gate created passed
Store/Plugin GateEnroll120df… — instance already in the mesh passed
  • Not "the probe landed on a type path." Store is the Store package's root, retyped to Store/Catalog by the installer — a correctly-typed instance.
  • Not "pre-existing instance vs fresh probe." Store/Plugin used a pre-existing instance and passed.

Why #1055 did not close it

It recurred on a commit that already carried #1055's fix (run 31361446933 at 06:18Z; #1055 merged 04:39Z).

Not cached is not not-pinned. A hub is pinned by address in Mesh.GetHostedHub and never re-reads its node's NodeType. So repairing the resolution path does nothing for a hub that a bad resolution has already activated — the wrong configuration is latched for the hub's lifetime. The only existing thing that un-pins it is PackageInstaller's DisposeRequest, which is fire-and-forget and conditional on the placeholder dance having run.

Why it deserves its own issue

What NOT to do

🚨 No band-aid: do not continue-on-error the gate, allow-list Store/Catalog, add a retry around the probe, or widen a timeout. The gate catches real public-API breakage — plugin source is Roslyn-compiled from mesh content, so a repo-local grep cannot prove a deletion safe (this is how AddSkillSource broke 8 NodeTypes). Weakening it is worse than the bug.

Where to look

  • Mesh.GetHostedHub — the address-keyed pin, and whether anything can invalidate it when the node's NodeType changes.
  • PathResolutionService.SynthesizePartitionRoot and PackageInstaller — both carry comment blocks with this ledger; they now pose three questions rather than two.
  • PackageInstaller's DisposeRequest — fire-and-forget and conditional; a retype that races it leaves the hub pinned.

Un-pinning an already-activated hub needs a repro and a design decision, not a guess — which is why #1103 documented it rather than attempting it.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions