packages feed

salmon-ops-0.3.0.0: CHANGELOG.md

# Revision history for salmon-ops

## 0.3.0.0 -- 2026-10-31

Breaking: `Salmon.Builtin.CommandLine`'s `RunServe` constructor gained fields (start-up
options, `--once`, `--linger`) and `ReportFormat` gained a constructor (`ReportTextJsonLog`).
Requires `salmon-core ^>=0.1.0.0` (unchanged).

Packaging: every external dependency now carries a PVP upper bound (`^>=` the version built on
GHC 9.10.3; `base` keeps its range).

`run serve`:

* `--once` ends the loop after the first convergence pass and exits with its verdict (0 only
  when the pass converged with nothing left); it starts with supervision off. `--linger SECONDS`
  keeps `--listen`/`--http`/`--http-tcp` answering reads from the final world that long after.
  In the library: `Serve.Ending` (`UntilQuit` | `AfterFirstPass`) and `serveSayingEnding`;
  existing entry points keep `UntilQuit`.
* `--json-log FILE`: the text reports on the terminal as before, plus the objects `--json`
  would print appended to FILE, one per line. Excludes `--json`.
* `--no-supervise` and `--up-directive FILE` run `supervise off` and `up-directive FILE` as
  the loop's first commands, ahead of any other input, so a loop started by a unit file needs
  nothing typed. `Serve.linesProducer` and `Serve.quoteArg` are exported for the same purpose.

New builtins:

* `ClickHouse`: the official image as a system-scope quadlet with watched `config.d`/`users.d`
  drop-ins; `CREATE DATABASE IF NOT EXISTS`, users whose password is a pre-provisioned file,
  database-level grants checked on `system.grants`, and `sourceReadGrant` (`GRANT READ ON S3`)
  for PeerDB. Nothing drops or revokes.
* `Postgres.Logical`: the prerequisites of logical replication (`wal_level = logical`, the
  `REPLICATION` attribute, a publication of exactly the declared tables, a `pgoutput` slot),
  each with a check and no down.
* `PeerDB`: Postgres and ClickHouse peers and CDC mirrors through PeerDB's flow API. A mirror
  that exists with other peers or tables, or has failed, is refused, never changed or recreated;
  nothing is dropped.

## 0.2.0.0 -- 2026-10-23

Breaking: several exported records gained or changed fields (e.g. `Gcp.Compute`'s instance,
`Client.Model`'s model) and some exported functions changed signature. Requires
`salmon-core ^>=0.1.0.0` (unchanged).

Packaging: a manual `http-server` flag (default on). `constraints: salmon-ops -http-server`
builds the library without `Salmon.Actions.Serve.Http` and without warp, warp-tls and wai, for a
binary that never serves HTTP; `run serve` then refuses `--http`/`--http-tcp`. The listener
configuration (`Bind`, `TlsBind`, `SessionPolicy`, `readTokenFile`) is now defined in
`Salmon.Actions.Serve.HttpBind` and still re-exported by `Salmon.Actions.Serve.Http`.

New builtins:

* `Podman.Quadlet`: containers as systemd services (bind volumes, `UserNS=keep-id`, readiness
  wait, registry login from a GCE instance, container jobs); `Systemd.Job`: oneshot units, timers
  and a node reading how the last run went.
* Postgres high availability: `Patroni`, `PgBackRest` (archive, PITR, replica method),
  `Haproxy` routing to the leader by health check, `Etcd` join phase.
* `PgTextSearch`, `ClipCpp` (embeddings for pgvector), `Plakar` integrations and GCS store.
* `LlamaServer.llamaEmbed`: one text's vector from a running llama-server, for a loader.
* `SecretDelivery` (a pre-provisioned secret onto a machine), `Deferred` (a sub-graph built at
  `up` from a value read then), `Netbird` peer enrolment, `PortMapping` (UPnP-IGD via `upnpc`),
  `Rsync.receiveDir`.
* GCP: `Gcp.CloudDns` (managed zones; A, AAAA, CNAME, TXT, MX record sets); the load balancer
  as one node per resource (HTTPS proxy, managed and replaceable certificates, host/path rules,
  backend buckets, redirects, path rewrites, removal of what is no longer declared);
  `Gcp.Storage` bucket IAM, lifecycle, website settings and published directories;
  `Gcp.Compute` pinned internal address, access scopes, machine-type resize, run limit;
  `Gcp.Core` declared gcloud account; Cloud Run min instances and always-allocated CPU.
* `Salmon.Builtin.Guarded` / `Salmon.Op.Guard`: guarded risky operations (preconditions in
  `check`, park on failure, hold siblings).

Behaviour:

* Processes started for a node no longer inherit the pass's standard input.
* `Binary`: choose where a command's stdout/stderr go, with per-node log lines
  (`Salmon.Builtin.NodeLog`); `Ssh`/`Self` follow a remote call's output and reports.
* `Dag.foldDag` visits each node once instead of each occurrence.
* `Query`/`serve`: paths are matched, never listed; a retraction redescribes nothing.
* Web UI: compact DAG layout, `/history` timeline, `Conflicting` pairs side by side.
* Web UI: an optional Tramaj card template per node (`withCardTemplate`), served on `/dag` as
  `template` and drawn in place of the default card; presentation only, not part of the
  representative.
* `Builtin.Cards`: opt-in card templates for `filecontents`, `dir`, `systemdService` and
  Postgres `database` (`withCard (Cards.fileContents path) op`); no builtin attaches one itself.

## 0.1.0.0 -- 2026-10-01

* First release.