A plugin lives across many host versions and many of its own versions. Semver gives operators a way to predict what an upgrade will and won’t change.Documentation Index
Fetch the complete documentation index at: https://docs.altnautica.com/llms.txt
Use this file to discover all available pages before exploring further.
Semver for plugins
UseMAJOR.MINOR.PATCH:
| Bump | When |
|---|---|
| PATCH | Bug fixes. No new features, no behavior changes operators would notice. |
| MINOR | Additive features. New optional permissions are fine. New required permissions are not. New slot contributions, new mission patterns, new vendor drivers. |
| MAJOR | Breaking changes. Removed features, renamed config fields, new required permissions, changed default behavior. |
Compatibility expressions
The manifest declares which host versions it supports:| Operator | Meaning |
|---|---|
=1.2.3 | Exact match. |
>=1.2.3 | At least 1.2.3. |
<2.0.0 | Strictly below 2.0.0. |
~1.2.3 | At least 1.2.3 and below 1.3.0. |
^1.2.3 | At least 1.2.3 and below 2.0.0. |
">=0.9.0 <1.0.0".
The host runs the check at install time and at every enable. A
host upgrade that pushes the running version out of range
disables the plugin and notifies the operator.
What goes in agent_version vs gcs_version
agent_version matches the running ADOS Drone Agent version reported by setup
status or /api/version. gcs_version matches the running Mission Control
build. They move independently, so a plugin can
support a wide agent range and a narrow GCS range or vice versa.
If the plugin is GCS-only, omit agent_version. If agent-only,
omit gcs_version. The host only enforces what is declared.
Update flow
- Operator drops a newer
.adospluginto the install dialog for an already-installed plugin. - Host runs the parse step. If the new version’s compatibility
block fails, the install is rejected with
compatibility_failed. - Host diffs the manifest’s permissions against the existing
grants:
- Removed permissions: silently dropped.
- Added optional permissions: shown in the dialog with an “off by default” toggle.
- Added required permissions: shown in the dialog with a red highlight; operator must approve.
- Removed required permissions: silently dropped.
- Operator clicks Install. Host stops the running plugin, unpacks the new archive, generates a fresh systemd unit, and starts it.
- The plugin’s
on_config_changeruns once with the existing config. The plugin migrates its own data dir if needed.
Additive vs breaking permission changes
Additive (MINOR safe):- Adding an optional permission.
- Adding a wildcard permission that subsumes existing ones, as long as the existing ones still work without operator action.
- Adding a slot contribution.
- Adding a config field with a default value.
- Adding a required permission.
- Removing a slot the operator depends on.
- Renaming a config field without a migration shim.
- Changing the wire format of a
plg.<id>.*event topic. - Changing the default behavior in a way the operator would notice.
Migration shims for config
Config schemas evolve. Carry aversion field and migrate on
first run after upgrade:
on_config_change with the migrated config so
the rest of the plugin stays oblivious.
Migration shims for data on disk
Data version goes in a separate marker file the SDK manages:Downgrades
The host refuses to install an older version on top of a newer one. The error code isdowngrade_blocked. Operators who really
need to downgrade run ados plugin remove <id> --keep-data then
install the older version; the data dir is preserved through the
graveyard.
Plugin authors should not assume their data format can be read
by older versions. Forward migration is the contract; backward
is best-effort.
Pinning the host
A plugin that must pin to one host version uses an exact range:Pre-release versions
Pre-releases use semver pre-release identifiers:1.0.0-rc.1 will be replaced by 1.0.0. Don’t
ship -rc builds to operators unless they asked for them; the
local-install path is a foot-gun if they didn’t.
Communicating breaking changes
A MAJOR version is contract-breaking. Plugin authors:- Update the README with a Migration section.
- Optionally ship a one-shot migration plugin that imports old state into the new format.
- Bump
ados_versionif the change required a host feature.