Skip to content

Feature request: a versioning indicator so users can verify a deployment is up to date #956

Closed

Description

@sierragolflima

Caveat on this report

This was investigated externally, without direct access to the AKS cluster or the
Azure subscription it runs on — via the GitHub API, the public HTTP surface of
memex.meshweaver.cloud, and browser checks in Settings. Everything below is what
was observable from outside; there may be a straightforward explanation we simply
couldn't see from this vantage point (e.g. a config difference on this specific
deployment, a rollout in progress, or something particular to how this environment is
set up). Filing this as a feature request with the observations attached, rather than
as a confirmed bug report, for that reason.

The need

It would help both users and operators to have a reliable way to tell how current a
live deployment is
— whether a recently-merged fix on main is expected to be live
yet, or still in flight. As far as we could tell, there is currently no way to answer
"is this deployment up to date?" without someone with direct cluster access checking
the running pod's image tag by hand on the production subscription on Azure.

What may already exist (this could just be a visibility gap on our end)

An "About" settings tab (global, ungated) appears to already exist in the codebase,
added in 1bd78e931 (2026-07-08, "About page, What's New feed, top-bar theme toggle
& build-commit stamping"
): it's described as showing the platform version and the
git commit the build came from, linking to it on GitHub. A "What's New" feed appears
to have landed in the same commit. Pull request #897 (2026-08-07) appears to extend
the About tab with an installed-plugin inventory.

If this is working as intended, this report is really about reachability/reporting
accuracy, not about needing new functionality.
We're genuinely unsure which of the
possibilities below applies — flagging both rather than assuming.

What we observed, for context

On memex.meshweaver.cloud, we could not find an About tab or a What's New tab in
global Settings, after a hard refresh and again with a completely fresh
session/cookie (so far as we could tell, this ruled out simple client-side caching
and being pinned to one specific backend pod via session affinity — though we can't
rule out possibilities we didn't think to test).

This seemed worth mentioning alongside a possibly-related data point: Systemorph/ Memex's GitHub Deployments record (which that repo documents as the registry of
record for this deployment) shows one status entry:

memex-cloud — success — "Running 3.0.0-ci.1842 (rolled by in-pod self-updater)" —
posted 2026-08-06T06:40:38Z

ci.1842 appears to correspond to MeshWeaver's CD workflow run #1842, created
2026-08-05T22:30:53Z from commit 1af1aaa84 — which, if we traced the history
correctly (git merge-base --is-ancestor), is a descendant of 1bd78e931 and so
would include the About tab. We flag this only as a possible inconsistency worth
someone double-checking with actual cluster access — we may well be misreading one or
both signals.

Possible directions (not mutually exclusive, and there may be others)

  1. The deployment hasn't picked up recent changes for some reason, and the posted
    status doesn't currently reflect that — in which case the self-update /
    status-reporting path might be worth a look.
  2. The relevant tabs are present in the running code but aren't rendering or
    registering for some reason specific to this environment — in which case it'd be
    a matter of finding what's suppressing them, likely without any visible error.
  3. Something about our investigation method missed the actual explanation entirely,
    and someone with direct access would resolve this quickly.

If it turns out the reported deployment status doesn't always match what's actually
serving traffic, it might be worth considering how to keep those in sync — though we
recognize there may be good reasons for the current behavior that we're not aware of.

Possible next steps, offered tentatively

  • If convenient: confirming whether the running memex-portal-* pod's actual image
    tag / creation timestamp is what's expected.
  • If the image turns out to be current: checking whether MemexConfiguration's hub
    setup reaches AddAboutSettingsTab() without an earlier issue interrupting it.
  • If useful: double-checking whether the self-updater's status-posting could be
    timed to when a rollout is confirmed serving, rather than when it starts — though
    this may already be how it works and we're misreading the timeline.

Why we thought this worth raising

Even setting aside the specific observations above, a simple, trustworthy way to see
"what is this deployment actually running" seems like it would be broadly useful —
for confirming a fix landed, and more generally for anyone trying to reason about
deployment state without cluster access.

Activity

  1. sierragolflima commented on Aug 10, 2026

    @sierragolflima
    CollaboratorAuthor

    Follow-up: the underlying build-currency fix in this issue is correct, but its own
    entry points — "About" and "What's New" from the profile menu — currently 404 for
    what looks like an unrelated code defect, independent of any deployment question.

    Repro

    Click the profile/account avatar top-right (not Settings — see "Where this is meant
    to live" below), then About or What's New. The page loads with:

    Page not found: '_settings/GlobalSettings/WhatsNew' does not match any registered
    address pattern.

    (Note: that message named WhatsNew even when the address bar showed .../About —
    possibly a separate stale-error-display issue, not chased further here.)

    Likely cause

    • The registered mesh node lives at path _Setting — singular, capital S
      (GlobalSettingsNodeType.SettingsPath, src/MeshWeaver.Graph/Configuration/GlobalSettingsNodeType.cs:21).
    • The profile-menu navigation hardcodes _settings — plural, lowercase
      (UserProfile.razor.cs:170,172, src/MeshWeaver.Blazor.Portal/Components/UserProfile.razor.cs):
      private void NavigateToWhatsNew() => Navigation.NavigateTo("/_settings/GlobalSettings/WhatsNew");
      private void NavigateToAbout() => Navigation.NavigateTo("/_settings/GlobalSettings/About");
    • _settings (lowercase) is otherwise used elsewhere in the codebase as a reserved
      satellite/schema segment name in the cross-schema Postgres/Snowflake routing — an
      unrelated meaning — not as an alias for this node.

    If the mesh path resolver is case/spelling-sensitive here (as a related fixed bug —
    PgOnlyProdShapeTests.ResolvePath_AreaSuffixOnExistingPartition_FallsBackToMainNode
    — suggests it is for adjacent shapes), this mismatch alone would 404 on any
    deployment, current or not. Not confirmed by running the app locally, so flagging as
    a strong lead rather than a proven root cause.

    Where this is meant to live — worth clarifying regardless of the above

    Separately from the routing bug: it took real back-and-forth to find "About" at all,
    because the naming is inconsistent about where it belongs:

    • This issue's own originating PR (The About page shows the platform build AND every installed plugin #897) describes it as "Settings → About."
    • The code calls it AddAboutSettingsTab(), grouped in a long chain of
      Add*SettingsTab() calls alongside ApiTokens, Instances, Notifications, etc.
      — all of which render in the per-user Settings navigation tree
      (Home > {user} > Settings).
    • But About/What's New actually register as GlobalSettings items, surfaced
      only from the profile/account menu (top-right avatar) — a separate page
      entirely from that Settings tree, at a different URL shape
      (/_settings/GlobalSettings/{tabId} vs. the per-user tree's own routing).

    Every other tab named alongside it in the source (AddPrivacySettingsTab,
    AddInvitationsSettingsTab, AddTokenUsageSettingsTab, etc.) is also a
    GlobalSettings item, not a per-user Settings tab — so this isn't unique to
    About/What's New, but it means the "Settings" framing in both the PR description and
    the code's own naming actively points a reader at the wrong navigation surface.
    Worth either renaming for clarity or adding a visible link between the two pages.

  2. sierragolflima commented on Aug 18, 2026

    @sierragolflima
    CollaboratorAuthor

    Follow-up to my earlier comment on this issue: the routing defect described there is now
    tracked properly as #1817, so it is findable outside a closed issue's comment thread.

    Two things changed since that comment:

    1. It spread. Show which build — and which instance — is serving the session #1791 (the top-bar build chip) added a third call site with the same
      hardcoded /_settings/… literal, so the About page is now unreachable from the chip as
      well as from the two profile-menu entries. That is the reason it is worth its own issue —
      it keeps propagating because the literal is repeated rather than derived from
      GlobalSettingsNodeType.SettingsPath.

    2. This issue's original ask is no longer blocked by it. Show which build — and which instance — is serving the session #1791's chip reports the running
      build (and the serving instance) persistently in the header, without navigating anywhere.
      So "can a user verify the deployment is current?" — the question this issue was filed for —
      is answered today, even though the About page it originally shipped on still 404s.

    Nothing here asks to reopen #956; the fix it requested did ship (#985, #1006). Recording the
    pointer so anyone arriving here from the About page follows it to the live defect.

  3. rbuergi commented on Oct 11, 2026

    @rbuergi
    Contributor

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

    Assessment: mostly built — two named gaps

    Checked origin/main @ c6607346e. It helps to split the request in two: "what build is this?" and "is that build current?". The first is fully shipped and visible to every user; the second exists but only for platform admins.

    Already shipped

    Build identity is baked in at compile time. Directory.Build.props → target AddCommitHashMetadata stamps the git SHA into every assembly as AssemblyMetadata("CommitHash"), sourced from the SDK's SourceRevisionId and falling back to GITHUB_SHA. It is deliberately kept off InformationalVersion because CI overwrites that with $(Version)+build.<ticks>, which drops the SDK's default +<sha> suffix. Version itself is 3.0.0-rc1.ci.$(GITHUB_RUN_NUMBER). So the raw material is in the image with no runtime plumbing needed.

    The About tab already surfaces it, ungated. memex/Memex.Portal.Shared/Settings/AboutSettingsTab.cs, registered at memex/Memex.Portal.Shared/MemexConfiguration.cs:915 (.AddAboutSettingsTab()). It renders Version, Build commit (as a link to the exact GitHub commit via ShippedReleaseSeed.CommitUrl), Repository, Runtime, and the live installed-plugin inventory. There is no permission gate — GetTab returns the definition unconditionally, unlike UpdatePolicySettingsTab / InvitationsSettingsTab, which filter on AdminMenuGate.IsPlatformAdmin. Localization keys are present (src/MeshWeaver.Messaging.Hub/Localization/strings.en.json:196-209 and :538).

    There is also a machine-readable copy. ShippedReleaseSeed.EnsurePlatformVersionNode writes the running version to the Admin/PlatformVersion mesh node at startup. The native client already consumes it: memex/Memex.Client/Services/UpdateNotificationService.cs reads a remote mesh's Admin/PlatformVersion and alerts when the remote is newer than the bundled build.

    "Is it up to date" is answered — for admins. memex/Memex.Portal.Shared/Settings/UpdatePolicySettingsTab.cs shows Running version + Latest available tag + when last checked, plus an "apply now" button. Those two bookkeeping fields (UpdatePolicyContent.LatestAvailableTag / CheckedAt) are written by the ACR poller at memex/Memex.Portal.Shared/SelfUpdate/SelfUpdateHostedService.cs:175.

    The actual gaps

    1. The running-vs-latest comparison is platform-admin only. UpdatePolicySettingsTab.GetTab gates on AdminMenuGate.IsPlatformAdmin (UpdatePolicySettingsTab.cs:45-48). A normal user gets About — what build is running — but no surface telling them whether that build is current. The issue asks for "users ... verify a deployment is up to date", and that half is admin-only.
    2. Nothing is reachable without an authenticated Blazor session. /health and /alive (memex/aspire/Memex.Portal.ServiceDefaults/ServiceDefaults.cs:111,114) carry no version, and there is no /api/version (grepped MapGet/MapPost across src/ and memex/ — nothing). So verifying from outside still requires logging in.

    On the observation in the report

    The About tab was in the deployed code. I checked 1af1aaa84 directly: AddAboutSettingsTab() is present at MemexConfiguration.cs:891. So "the code wasn't in that image" does not explain a missing tab on ci.1842.

    However, the deployment has rolled forward twice since the report was filed. Current state:

    memex-cloud   memex-portal-deployment   meshweaver.azurecr.io/memex-portal-ai:3.0.0-rc1.ci.2340
    memex         memex-portal-deployment   meshweaver.azurecr.io/memex-portal-ai:3.0.0-rc1.ci.2340
    client-i         memex-portal-deployment   meshweaver.azurecr.io/memex-portal-ai:3.0.0-rc1.ci.2151
    

    In ACR, 3.0.0-rc1.ci.2340, c660734 and main are the same manifest digest (sha256:7d532f06…), and c660734 is current origin/main HEAD.

    So: worth re-checking Settings → About on memex.meshweaver.cloud before anyone chases a rendering bug. If the tab is there now, the original observation was against the older image and only the two gaps above remain. If it is still absent on ci.2340, that is a separate live defect and deserves its own issue — the registration is unconditional, so an absent tab would mean something is interrupting hub configuration, not a missing feature.

    (One structural note on the report's method: the About tab is the thing that tells you the build, so its absence can never itself be read as evidence of staleness.)

    Smallest honest implementation

    Add the running-vs-latest line to the About tab, which is already ungated and already renders ShippedReleaseSeed.InstalledPlatformVersion. The comparison values already exist on Admin/UpdatePolicy (LatestAvailableTag + CheckedAt) — no new state, no new poller.

    The one design decision this forces: Admin/UpdatePolicy lives in the Admin partition, so a normal user most likely cannot read it. I did not verify a non-admin read against a live mesh, so treat that as the open question rather than settled. Two ways out:

    • (a) mirror the poller's finding onto a node ordinary users can read, or
    • (b) have the About tab read it as System and render only the derived string ("up to date" / "update available: X"), never the policy node itself.

    (b) is smaller and leaks less.

    If an out-of-band check is also wanted, a MapGet("/api/version") returning {version, commit} is a few lines and needs no new state — but that is a separate, additive decision, not required by the above.

    Recommendation

    Keep open, but retitled around the real remainder rather than the original premise. Two named items:

    • Running-vs-latest is admin-gated — surface it on the ungated About tab.
    • No unauthenticated version surface — decide whether /api/version is wanted.

    Everything else this issue asks for — version, git commit, GitHub link, visible to every user — is on main today.

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