A Vial is a local copy of a pinned program. The host fetches the manifest and its UI assets, verifies the hashes, runs the same gate as a local import, and only then writes the pack. An update is a second, verified install; a report carries the identity of the exact bytes that failed.
If the registry has no pinned hash for a legacy Vial, the install still runs the local gate but cannot verify the bytes against a review record. That Vial is shown as a manifest install, not as a reviewed listing. New v2 Vials are pinned.
| Check | Failure |
|---|---|
| Manifest sha256 matches the registry | “The manifest on disk does not match the sha256 recorded in the registry — it changed upstream. Refusing to install.” |
| Every UI asset sha256 matches | The asset name and the mismatch are reported; nothing is cached or installed. |
| The manifest id matches the registry id | “The manifest id does not match its registry entry. Refusing to install.” |
| The manifest passes the local gate | The pack is saved only after the gate passes. A failing gate leaves the previous copy untouched. |
| The redirect stays on HTTPS | A manifest that redirects away from HTTPS is refused before parsing. |
The hash is the contract. A changed profile or a changed UI is a new version; a changed byte under the same version is an integrity failure.
When the registry pins a version newer than the installed copy, the Aromatory adds an Updates section with Update to vX. The update path is the install path: fetch, verify the new manifest and every UI asset, run the gate, save, and replace the active copy. The old copy is not trusted because it was installed before.
There is no one-click rollback or signed revocation list in this release. If a version is bad, the author publishes a fixed version, the reviewer approves it, and users update. The report path is how the bad version is identified.
The Vial runtime bar has Report a problem. It opens a prefilled issue with:
If the manifest names a GitHub repository, the issue opens on the author's tracker. If it does not, it opens on the Osmograph tracker with [Vial report] in the title. The identity block is what lets the author reproduce the report instead of guessing which version the user had.
| Thing | Needs network? | Where it lives |
|---|---|---|
| Installed manifest | No | Local pack store |
| Installed UI | No | Local UI cache, keyed by Vial id and version |
| Registry list / update check | Yes | Fetched on Aromatory open; failure leaves installed Vials usable |
| Fields and logs | No | Local storage for the Vial |
| Report issue | Yes | Opens the system browser |
Uninstalling removes the Vial from the active list. The saved manifest, cached UI, and local fields/logs remain in local storage until you delete the pack or its data. That is deliberate: an accidental uninstall should not destroy a batch log.
| Symptom | Cause | Action |
|---|---|---|
| “Manifest changed upstream” | The registry pins a hash that no longer matches the file. | Ask the author to restore the file or publish a new version and resubmit. Do not bypass the check. |
| “UI asset does not match” | The `ui.html` or `home.html` changed after review. | Same as above. The UI is part of the reviewed program. |
| “Unknown bridge method” | The UI calls an `osmograph.*` method that is not in the contract. | Use only the documented bridge methods; the gate refuses the unknown call. |
| “This Vial's detection profile is compiled from its manifest” | A v2 UI called `setDetection` or `setTransforms`. | Publish a new manifest version with the profile change. Runtime override is legacy-only. |
| “All channels are silent or dead” | The rig is not streaming, or every declared channel is flat. | Check the link and the channel health. Detection stays off until the data supports it. |
| No update appears | The registry has not updated, the version was not bumped, or GitHub is serving a cached file. | Reload the Aromatory; verify the version and hash in the registry entry. |
| The workspace opens but the UI is blank | The fragment failed its sandbox check or the script threw. | Use Report a problem; the toast carries the UI error. Re-run `noses test` locally. |