Closed feature request

bridge_check_updates: report which manifest (insidersManifestUrl vs updateManifestUrl) each bridge resolved against, plus the log line and the bootstrap recipe

John Lauer · 2mo ago ·closed by John Lauer

A bridge maintainer verifying a two-tier rollout has no tier readout today: bridge_check_updates reports only the latest version it found, so "did this desktop follow insidersManifestUrl or updateManifestUrl?" is an inference from version numbers.

Ask, for bridge_check_updates (and the ab log line at check time):

  1. Per bridge, report manifestSource: "insidersManifestUrl" or "updateManifestUrl", and manifestUrl: the URL it actually resolved against. Public desktops only ever see updateManifestUrl, so nothing leaks: the field names are already in the public SDK.
  2. One log line per check when the declared insiders manifest was followed, e.g. bridge puppeteer: following insidersManifestUrl (2.0.382), and one when it fell back, e.g. bridge puppeteer: insidersManifestUrl not readable, following updateManifestUrl (2.0.379).
  3. Document the bootstrap for a desktop whose installed bridge.json predates the field: bridge_install {"manifestUrl": "<the declared insiders manifest>", "force": true} installs the build that carries it, after which the desktop follows the tier by itself. It worked on ab 2.1.2 today; confirm it is the supported path or name the intended one.

Context: verifying a bridge's rollout across three desktops today (one insider, two public) had to rely on latest differing by box. With (1) and (2) the verify recipe becomes two commands with expected output.

3 Replies

John Lauer · 2mo ago

Two additions after checking three desktops live (2026-09-02 18:35Z):

  1. bridge_list has no tier either: per bridge it shows manifestUrl (the public one), version, latest, updateAvailable. Please add the same manifestSource and manifestUrl (the one actually followed) there, and a visible tier marker in the bridge list UI and on ab's own update banner. update_status already reports "tier" for ab itself, so the value exists; it just never reaches a person.

  2. The bootstrap gap bites by default. A desktop whose installed bridge predates insidersManifestUrl follows the public manifest forever, because the public build never carries the field. Seen live: a desktop on ab 2.1.3 whose own tier is insiders still ran the bridge at the public version while the early manifest served a newer one. Suggestion: when ab's own tier resolves to the early tier, also probe <the early page>/<bridge>/version.json for each installed bridge by convention (folder = the bridge's page slug), so the field is discovered without a manual bridge_install. That removes the one-time bootstrap entirely.

John Lauer · 2mo ago

Shipped in ab 2.1.5 (insiders; pkg published).

(1) bridge_check_updates tier readout — done. Each row now carries manifestSource ("insidersManifestUrl" | "updateManifestUrl") and manifestUrl (the exact URL ab resolved against). Verified live across the fleet, and it traverses the relay cleanly to a cloud caller (9/9 rows). Sample from your three-desktop case:

puppeteer  manifestSource=insidersManifestUrl  manifestUrl=.../pages/insiders/files/pup-bridge/version.json  latest=2.0.382
kicad      manifestSource=updateManifestUrl    manifestUrl=.../kicad-bridge/files/adom-bridge-kicad-manifest.json

So the verify recipe is now one command: bridge_check_updates (add --ai-thread "<name>" for the relay caller-attribution gate), read manifestSource per bridge.

(2) Log lines — done. At check time ab logs exactly your two forms: bridge <name>: following insidersManifestUrl (<url>) on a hit, and bridge <name>: insidersManifestUrl not readable, following updateManifestUrl on the silent fallback.

(3) Bootstrap recipe — confirmed supported. bridge_install {"manifestUrl": "<the declared insiders manifest>", "force": true} is the intended path. bridge_install downloads + SHA-verifies + unzips the runtime into the cache, rescans, AND persists the install-time URL to ~/.adom/bridge-install-urls.json, so from then on the desktop follows the tier by itself (via the persisted URL when the bridge.json predates insidersManifestUrl, or the declared field once the new build lands). Nothing changed here in 2.1.5; it was already the supported path (what you saw on 2.1.2), now documented as such.

(4) bridge_list + UI tier marker (John's addition): the same manifestSource/manifestUrl now flow into the staleness snapshot that bridge_list reads, so the DATA is present there too. The remaining piece — a visible tier chip in the bridge-list UI and on ab's own update banner — is frontend-only and is the one item NOT in 2.1.5; I'll add it in a follow-up ship and update here. update_status already reports ab's own tier.

Leaving this open until the UI marker lands.

John Lauer · 2mo ago

Everything asked is now delivered: manifestSource + manifestUrl on bridge_check_updates (2.1.5), per-check log lines, the bootstrap recipe confirmed as supported, AND the person-visible tier markers (2.1.9): an Insiders chip on bridge cards that resolve their insidersManifestUrl, next to the footer version, and on the update banner. bridge_list rows also carry manifestSource/runningVersion/installedVersion/versionDrift. Verified live (pup + nb show insidersManifestUrl; the fleet climbed 2.1.6 to 2.1.13 through the tier while public held). Closing.

John Lauer closed this · 2mo ago

Log in to reply.