• v1.17.15 103e0b8d10

    Morphit v1.17.15
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 33s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 54s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 47s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m29s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 58s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 34m34s
    morphit-release / Build + publish release tarball (push) Successful in 36m22s
    Stable

    agorise released this 2026-09-18 01:19:52 +00:00 | 0 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.15

    Makes adding a privacy-network address safe to do without guessing. No protocol
    or consensus change.

    Fixed

    • You can now see which addresses a registration will publish, before you sign
      it.
      Publishing your instance to the federation is permanent, and peers reach
      you at whatever those addresses say — but the confirmation screen showed only
      your origin, name, contact and tag. It never showed the addresses themselves.
      That is exactly how one instance came to announce a privacy address its own
      router had stopped hosting: every peer's attempt to reach it that way failed,
      and the one moment someone could have noticed showed nothing. All of them are
      now listed for you to check first.

    • Your instance reads its own privacy address from the right setting. It
      previously took the first address-shaped value found anywhere in the
      configuration file. On an instance that also lists other nodes' privacy
      addresses — which most do — that could pick up someone else's and then report
      your correct configuration as wrong, indefinitely. It now reads the setting
      that holds your address.

    • Importing a privacy-network key now checks that it is the right key. It was
      accepted on sight. Morphit now works out which address the key actually
      belongs to and shows it, so you can confirm it matches the address you
      publish — and warns you plainly if it does not. A key file exported as text
      (base64) is now accepted as-is rather than refused.

    • And it tells you if you have the address rather than the key. The long
      string you publish as your address looks a lot like a key file and is easy to
      grab by mistake. It cannot be used to host anything: your server could not
      prove the address is its own, so the site would simply never load there, with
      no error to explain why. Morphit now recognises it, explains the difference,
      refuses the import, and tells you what the real key file looks like.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • Adding a vanity name (something.i2p) alongside your long address is safe: the
      long one stays the address of record, since a vanity name only resolves for
      users whose router knows the registry it is listed in.
    Downloads
  • v1.17.14 09c3949183

    Morphit v1.17.14
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 34s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 56s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 54s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m59s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 59s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 35m12s
    morphit-release / Build + publish release tarball (push) Successful in 36m25s
    Stable

    agorise released this 2026-09-17 18:21:24 +00:00 | 1 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.14

    Three fixes to what an upgrade tells you and how long it interrupts your site.
    No protocol or consensus change.

    Fixed

    • Your site is restarted once per upgrade instead of twice. The web front end
      was rebuilt and restarted a second time moments after the first, every upgrade,
      even when nothing about it had changed — a short outage for no reason. The
      second pass exists for a real case (an older installer that does not rebuild),
      so it now asks the running site what settings it is actually using and does
      nothing when they already match.
    • The warrant-canary reminder now tells you the truth for your setup. It said
      the canary "republishes on its own at the next scheduled weekly refresh". That
      is only true on an instance that runs that refresh itself. If you sign your
      canary on another computer, nothing on the server republishes anything — and
      believing otherwise would let it go stale after 14 days and show your visitors
      a false tamper warning. The reminder now checks which setup you have and says
      what actually applies.
    • A privacy-only instance no longer gets two contradictory messages. One said
      a check was skipped because the instance is reached through Tor and I2P; the
      next told it to configure an ordinary web address it correctly does not have.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • If a recent upgrade warned that your privacy address was "advertised wrong",
      that came from the previous version doing the check. It settles once every
      instance is on this release.
    Downloads
  • v1.17.13 00c4c086a1

    Morphit v1.17.13
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 34s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 55s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 48s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m51s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 54s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 35m0s
    morphit-release / Build + publish release tarball (push) Successful in 37m53s
    Stable

    agorise released this 2026-09-17 06:31:21 +00:00 | 2 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.13

    Stops an upgrade interrupting operators who sign their warrant canary on a
    separate computer. No protocol or consensus change.

    Fixed

    • An upgrade no longer stops to ask about your warrant canary if you already
      have one.
      If you sign your canary on another machine and upload it, a
      redeploy clears the copy on the server until you upload the next one. The
      upgrade only remembered as far back as the previous install, so if you ever
      skipped an upload, the next upgrade concluded you had never had a canary and
      offered to create one on the server — which would have made a second signing
      key competing with your real one, and stopped an unattended upgrade waiting
      for an answer. Your instance now remembers permanently that you have a canary,
      and also checks whether your live site is serving one. A brand-new instance
      with no canary at all is still offered one, as before.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • If a recent upgrade asked you about setting up a canary and you sign yours
      elsewhere, answering "no" was correct. After this release it will not ask again.
    Downloads
  • v1.17.12 7d828b9f20

    Morphit v1.17.12
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 32s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 55s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 48s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m46s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 58s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 34m59s
    morphit-release / Build + publish release tarball (push) Successful in 35m31s
    Stable

    agorise released this 2026-09-17 00:41:20 +00:00 | 3 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.12

    Fixes a mistake introduced in v1.17.11 that stopped an upgrade finishing its
    final checks. No protocol or consensus change.

    Fixed

    • The last step of an upgrade completes again. v1.17.11 added a check that
      skips an irrelevant test on privacy-only instances. On an ordinary instance
      that check looked at a value that had not been set yet, which stopped the
      script on the spot. The release itself was never at risk — it was published,
      recorded on-chain and pinned before this point — but the instance stopped
      before confirming it serves the new version over Tor and I2P, so other
      instances could not be sure they could fetch it from you. Upgrading applies
      the fix; nothing else is needed.
    • The retry advice now works. The message shown when that step fails pointed
      at a command that could not run on its own. It now names the menu entry that
      does the job, and says plainly what was left unfinished rather than implying
      the whole thing failed.
    • No more "new version of npm available" after an upgrade. That notice was
      already meant to be silenced, but it was silenced too late in the process to
      take effect. It advised an upgrade you should not perform, since each release
      ships with the versions it was tested against.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • If your last upgrade ended with a warning about the self-seed step, this
      release is the fix. After upgrading, that step runs to completion on its own.
    Downloads
  • v1.17.11 3e5a5a3762

    Morphit v1.17.11
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 54s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 57s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 47s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 2m53s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 1m19s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 34m23s
    morphit-release / Build + publish release tarball (push) Successful in 36m3s
    Stable

    agorise released this 2026-09-16 20:09:36 +00:00 | 4 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.11

    Fixes the last reason a Tor/I2P-only instance could not mirror the federation
    snapshot, and stops two checks reporting healthy instances as broken. No protocol
    or consensus change.

    Fixed

    • A privacy-network-only instance can finally mirror the snapshot. Requests to
      the chain were given ten seconds to complete. That is generous for the ordinary
      internet and impossible over Tor or I2P, where the connection has to be built
      before any data moves and half a minute is normal. So every attempt was
      cancelled before it could succeed — on working and broken addresses alike — and
      reported as "no usable endpoint", while the very same address answered a manual
      request in seconds. The allowance now depends on how the address is reached:
      ordinary addresses keep the short limit, privacy-network ones get a much longer
      one.

    • An instance no longer accuses itself of advertising the wrong address. The
      new check read the first privacy address its router reported, which is only
      correct on a machine hosting exactly one. A machine hosting several compared a
      stranger's address against its own and declared correct settings wrong — while
      the line below confirmed that same address was serving. It now looks at the
      right entry, and says nothing at all when it cannot tell which one is ours.

    • An instance without ordinary internet is no longer reported as broken. One
      check tried to reach the site the way an ordinary visitor would. A
      privacy-only instance has no such entrance — it is reached through its Tor and
      I2P addresses — so the check always failed and warned about an instance whose
      Tor and I2P checks passed two lines later. It is now skipped for those
      instances, with the reason stated.

    • Every part of Morphit now uses the full list of chain nodes. The instance
      publishes a list of chain nodes on-chain so instances always have plenty to
      choose from. The part of Morphit that reads the chain used that full list; the
      part that sends things to the chain — account signups and transfers — did
      not, and stayed on the handful written into its configuration. That is
      backwards: sending is exactly what you least want failing when ordinary
      internet nodes go down, and it is what the privacy-network nodes exist to keep
      working. Both now use the whole list.

    • Short-lived jobs no longer start from scratch. Your instance continuously
      learns which nodes are fast and which are down. Anything that runs and exits —
      the mirror job, a fast-sync, any one-off command — threw all of that away and
      worked through nodes in the order they happen to be listed, waiting out a full
      timeout on one that was already known to be down. That knowledge is now shared,
      so a one-off job goes straight to a good node. Nothing is ever struck off the
      list: a node that was down a minute ago may be back, and still gets its turn.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • An instance that could not mirror will do so on its next upgrade or its next
      scheduled attempt.
    • If a recent upgrade warned that your privacy address was "advertised wrong",
      check it against what your router reports before changing anything — that
      warning was unreliable before this release.
    Downloads
  • v1.17.10 7c59ff43b2

    Morphit v1.17.10
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 32s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 56s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 51s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m52s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 57s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 33m38s
    morphit-release / Build + publish release tarball (push) Successful in 35m35s
    Stable

    agorise released this 2026-09-15 05:47:57 +00:00 | 5 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.10

    Removes a step that could hold a release hostage, and finishes the operator-facing
    follow-ups from v1.17.9. No protocol or consensus change.

    Fixed

    • Publishing a release no longer waits on anyone else. The release checklist
      ended with a step that asked a public gateway whether it could see the new
      version yet. Those gateways take minutes to notice fresh content, so a perfectly
      good release could sit there for half an hour, repeating "not yet" — and the
      operator had no way to tell a slow gateway from a real problem. That step is
      gone. The upgrade already proves the same thing better and earlier: it confirms
      the file it produced matches the one recorded for the release, and that it is
      being served over the instance's own address, its Tor address and its I2P
      address — which are the paths other instances actually use. A public gateway
      noticing later adds nothing and is outside anyone's control. The check is still
      available to run by hand if you ever want it; it simply cannot block a release.
    • When it is run by hand, it answers immediately. Given the instance that just
      published, it asks that instance and returns in about a second instead of
      polling. Without one it says so plainly, with the exact command to re-run,
      rather than grinding through a long wait and looking like something is broken.

    Notes

    • No protocol/consensus change. This is release-process and operator-facing only.
    • Nothing you run on your servers changes. The difference is in the release
      checklist itself.
    Downloads
  • v1.17.9 adcaf972f2

    Morphit v1.17.9
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 33s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 54s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 47s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m38s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 58s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 33m50s
    morphit-release / Build + publish release tarball (push) Successful in 35m33s
    Stable

    agorise released this 2026-09-14 23:30:53 +00:00 | 6 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.9

    Clears the whole remaining follow-up list. Mostly about instances telling you the
    truth: catching an advertised address your own router does not actually host,
    and not burying you in repeats of the same alert. No protocol or consensus change.

    Fixed

    • An instance now notices when it is advertising an address it does not host.
      One instance published a privacy-network address that its own router had stopped
      serving — the key had been regenerated at some point and the setting was never
      updated. Every peer trying to reach it that way failed, for an unknown length of
      time, hidden by its other address still working. Your machine already knows the
      answer: both privacy services publish locally what they are really hosting. An
      upgrade now compares the two and, if they differ, prints both and the exact
      setting to change.
    • A check no longer explains away its own finding. When that address was
      broken, the message said privacy tunnels are slow to start and to try again
      later — so nobody investigated. It now distinguishes "no answer yet", which
      genuinely deserves patience, from "an answer came back", which means the tunnel
      is working and something further along is wrong.
    • Alerts stop repeating themselves. Background checks run on a timer, so an
      unchanged problem was re-announced every few minutes. The same condition is now
      reported at most once every six hours; any change is reported immediately, and a
      persisting problem still re-announces on that cadence so nothing is forgotten.
      If the bookkeeping cannot be written it goes back to reporting every time —
      never to silence.

    Added

    • You can now rehearse fast-sync from the menu. "Fast-sync" accepts a rehearse
      option that finds, downloads and verifies the newest snapshot and then stops,
      touching nothing. It is safe on a running instance. Previously this required a
      hand-typed developer command, which meant the one thing most worth testing was
      never tested.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • If an upgrade reports an address mismatch, fix the setting it names and then
      re-publish your registration so other instances learn the working address.
    • To rehearse: sudo morphit-ops fast-sync --rehearse.
    Downloads
  • v1.17.8 70c1ffa7f1

    Morphit v1.17.8
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 31s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 56s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 49s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m56s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 56s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 33m45s
    morphit-release / Build + publish release tarball (push) Successful in 35m30s
    Stable

    agorise released this 2026-09-14 04:56:15 +00:00 | 8 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.8

    Makes fast-sync actually work on a node with no clearnet — the case the whole
    feature exists for, and the one that had never been tested. No protocol or
    consensus change.

    Fixed

    • A Tor/I2P-only node can now fast-sync at all. Routing for hidden addresses
      was switched on by the indexer service and nowhere else, so the service read
      the chain happily over I2P while any of the tools running beside it aimed the
      same request straight at a hidden address with no proxy and got a bare
      "failed". A hidden-only node therefore could not even look up where the
      snapshot was, let alone fetch it — which is why one such instance would not
      mirror. Both the snapshot fetcher and the mirror now switch routing on
      themselves, and still refuse to fall back to the open internet.
    • Serving snapshots over the web works on more instances. The web front end
      passed the visitor's own hostname through to the local IPFS gateway. A gateway
      treats an unfamiliar hostname as a name it might have to look up, and on a node
      configured not to fetch, that request simply hangs — so the page eventually
      returned "not found". It now passes an address the gateway recognises. The
      affected instance's Tor and I2P paths were unaffected throughout, which is why
      this went unnoticed.
    • The gateway self-check stops reporting a healthy box as broken. It was
      asking with the same unusable hostname, so it declared the connection blocked
      on machines where it was fine, and its firewall repairs were aimed at a problem
      that did not exist.
    • Mirroring waits for the network to come up. A node restarts IPFS during an
      upgrade and the mirror ran immediately afterwards, when IPFS was answering but
      had no connections yet. It spent ten minutes trying to fetch from a network it
      had not joined, then gave up. It now waits for connections and, if there are
      none, says so and retries later instead of stalling.

    Added

    • Fast-sync is now genuinely tested on a simulated zero-clearnet node, over
      Tor and I2P separately — they are different code paths, so passing one proves
      nothing about the other. The tests use faithful stand-ins for both proxies and
      confirm the traffic really went through them, rather than trusting that the
      request succeeded.
    • That test also proves the privacy guarantee: offered a working open-internet
      source, a hidden-only node still refuses it rather than quietly using it to
      finish sooner.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • An instance that could not mirror before will do so on its next upgrade, or
      at its next scheduled attempt.
    • OPERATIONS.md §52 covers the snapshot pipeline and how to check it.
    Downloads
  • v1.17.7 81c4ff4e33

    Morphit v1.17.7
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 33s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 1m0s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 53s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m56s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 1m0s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 31m10s
    morphit-release / Build + publish release tarball (push) Successful in 33m6s
    Stable

    agorise released this 2026-09-13 22:21:49 +00:00 | 9 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.7

    Finishes what v1.17.6 started: the snapshot publisher now works when run on a
    schedule, and operator alerts stop repeating themselves. No protocol or consensus
    change.

    Fixed

    • The snapshot publisher works on a timer. It talks to IPFS by switching to
      the IPFS account first — and on a hardened server, both of the standard tools
      for doing that are blocked: one is refused outright by the service's security
      settings, the other is not permitted to change accounts at all. The job is
      already running with full privileges and does not need to switch accounts: the
      IPFS command line only reads a small file and then talks to the running service
      over a local connection. It now tries talking directly first, falls back to
      each account-switching tool in turn, and uses whichever actually works —
      reporting which one it chose. Guessing which tool a given server permits is
      what made this fail repeatedly.
    • Alerts stop repeating. A unit that stayed broken produced a CRITICAL alert
      every five minutes, over and over, for the same unchanged fact. Alerts now fire
      when something changes: once when a unit fails, once when it recovers, and
      again if it fails afresh. A repeat failure is never swallowed, and if the
      bookkeeping cannot be written the behaviour falls back to alerting every scan
      — never to silence.

    Added

    • The alert monitor is now genuinely run during testing, driven through a
      whole failure → recovery → failure-again cycle, because "alerts once and then
      stays quiet" is a property you can only observe by running it repeatedly.
    • The publish test now reproduces a server where both account-switching tools
      are blocked
      , which is the exact situation that broke the live publisher.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • If you disabled the publish timer to stop the alerts, re-enable it after
      upgrading: sudo systemctl enable --now morphit-snapshot-publish.timer.
    • OPERATIONS.md §52 covers the snapshot pipeline and how to check it.
    Downloads
  • v1.17.6 1c699b070e

    Morphit v1.17.6
    All checks were successful
    morphit-ci / Supply-chain audit gate (fail on new high/critical) (push) Successful in 33s
    morphit-ci / TypeScript typecheck (sweep all workspaces) (push) Successful in 59s
    morphit-ci / apps/web svelte-check (svelte-kit sync + svelte-aware tsc) (push) Successful in 46s
    morphit-ci / Integration tests (real Postgres 16) (push) Successful in 1m23s
    morphit-ci / ansible-lint (playbook quality gate) (push) Successful in 59s
    morphit-ci / Smoke suite (run-smokes.sh, triple-pulse) (push) Successful in 31m16s
    morphit-release / Build + publish release tarball (push) Successful in 34m8s
    Stable

    agorise released this 2026-09-13 19:42:30 +00:00 | 10 commits to main since this release

    Signed by agorise
    GPG key ID: 53524E1F1017EB9C

    Morphit v1.17.6

    Two things get fixed here: operator alerts that were unreadable, and a snapshot
    publish timer that could not complete a single run. Both had the same underlying
    cause — code that was only ever run by hand, never under the conditions it runs
    in for real. No protocol or consensus change.

    Fixed

    • Operator alerts arrive in ONE conversation, and you can read them. The alert
      bot remembered which private conversation to use only until it restarted — and
      it restarts on every upgrade. So each upgrade started a brand-new conversation,
      filling your inbox with duplicates, and because each new one needed its own
      encryption keys shared to a device the bot had never been introduced to, most
      alerts arrived as "Unable to decrypt message". The conversation is now
      remembered across restarts, and encryption is off by default for alerts: an
      alert you cannot read is worth nothing, and these are notices to your own
      account, not secrets. Set MORPHIT_MATRIX_ENCRYPT=1 to turn it back on.
    • Recovering from an encryption-key conflict no longer loses your place. That
      recovery deleted the bot's entire saved state — which also held its position in
      the alert stream and the conversation it uses — so "fixing" encryption started
      yet another conversation. It now clears only the encryption keys.
    • The snapshot publish job can complete a run. Under the service manager it
      failed at a different step each time, for five unrelated reasons, none of which
      appeared when the same script was run by hand: the file was not marked
      executable; a failure discarded the explanation instead of printing it; moving
      the finished snapshot out of a private temporary area failed because it crossed
      a storage boundary; the tool used to switch to the IPFS account is not permitted
      under the service's own security settings; and the check for "is IPFS up?" gave
      up instantly even though this very script restarts IPFS moments earlier.
    • Two other background jobs could never start either. The release monitor and
      the treasury re-pin were shipped without the executable flag, so the service
      manager refused to run them. Probably for some time, silently.
    • A failing publish now tells you why. Several steps sent a failed command's
      output to the bin and reported only "failed". They now print what the command
      actually said.

    Added

    • The publish and mirror jobs are now really run during testing, against
      stand-in IPFS and chain services, instead of only being read. Every failure
      listed above was reproduced and confirmed to be caught by these new tests. The
      mirror test also confirms it refuses a snapshot whose contents do not match the
      published fingerprint, and one published for a different chain.
    • A standing check across every background job: each must be executable, must
      not use a privilege tool its own security settings forbid, and must not discard
      the output of a command whose failure it is reporting.

    Notes

    • No protocol/consensus change. Everything here is operator-facing.
    • If your alert inbox has several "Morphit alerts" conversations, you can leave
      the old ones; after upgrading, the bot settles on one and stays there.
    • OPERATIONS.md §52 covers the snapshot pipeline, publishing, and how to check
      it.
    Downloads