Skip to content

Release notes — 0.18.0

Released 2026-07-04 with DNS Conduit 0.18.0.

Changes merged to main that are not yet tagged. Staging area for the next operator release.

Breaking changes — Rule Rhai host API

Rule Rhai scripts must be updated before upgrading to this release. Legacy host symbols are removed; there are no compatibility aliases.

Run conduitctl validate --file <config> after updating every .rhai script referenced in your config.

Migration table

Legacy New Notes
table_lookup(table, key) lookup(table, key) Global function; same lookup semantics
txn.metric_inc(name, delta) metrics.inc(name, delta) metrics object is in hook scope
txn.metric_inc_labels(name, delta, labels) metrics.inc_labels(name, delta, labels) Same
log_info(msg) log.info(msg) log object in hook scope
log_warn(msg) log.warn(msg) Same
question_qname(txn) txn.question().qname Use txn.question() when you also need qtype, class, or opcode

New read-only surface: runtime.routing

On pools with health enabled, scripts can read Route-consistent routing/health state at hook entry:

  • runtime.routing().pool(name) — configured_count, eligible_count, fail_open_active, and pool aggregates (minimum latency EWMA via min_latency_ewma_ms, max_outstanding)
  • runtime.routing().backend(pool, id) — applied, observed, eligible, frozen, latency EWMA (latency_ewma_ms), weight_factor, outstanding, last_transition_unix_ms (id = backend name or ip:port)
  • runtime.routing().backend_for_attempt(pool, backend_id) — same backend view for a named attempt; pass txn.selected_pool() and txn.selected_backend_name() for the current attempt

Use method call syntax: runtime.routing().pool("default"), not runtime.routing.pool(...).

Values reflect host state at hook entry on this worker (the same sources Route uses). There is no stronger transactional guarantee against concurrent probe or passive health updates.

Unknown pool or backend at runtime returns an empty view (documented sentinel field values).

Unchanged on txn

Policy effects remain on txn: set_pool, tags, retry/drop, egress overrides, question(), response(), sampling helpers, selected_*, and related methods.

Operator action

  1. Update every rule .rhai file using the migration table above.
  2. Re-run conduitctl validate on each config before reload.
  3. See Host API overview, Runtime API, Data sources and lookups, and User metrics for the updated reference.

Backend health

Shipped in the same release as the Rhai host API changes above:

Scripts read live health through runtime.routing on the hot path — not control-plane RPC per query. See Runtime API — routing.

Health and forward metrics

  • conduit_probe_results_total (full only) — active health-probe outcomes per backend (success, failure, timeout, send_error).
  • conduit_forward_errors_total now includes a backend label (pool, backend, reason) so timeouts and other forward errors are attributable per upstream. Existing PromQL that only groups by pool / reason still works; series identity gains the new label.
  • Passive fast-trip logs each counting failure and the trip event at WARN with query and client context — Backend health.

All changes in this release (automated pull request list).