v0.3.210 -- 2026-10-13

v0.3.210 — 2026-10-13

  • plan: f15-nautobot-import frozen
  • backlog: F15, Nautobot import (ADR-034)
  • plan: f15-nautobot-import, empty.golden loses its zero interval line
  • importer: lift the migration report types out of the Nagios frontend
  • importer/nautobot: map one GraphQL response onto hosts
  • importer/nautobot: fetch the device query from a Nautobot
  • cmd/jaque: import -from nautobot
  • importer/nautobot: test against a real Nautobot in a container
  • plan: f15-nautobot-import, import examples put flags before the path
  • docs: Nautobot import
  • fix: from-nagios.md names both import frontends
  • backlog: F15 done
  • fix: test nautobot.Position

v0.3.209 -- 2026-10-13

v0.3.209 — 2026-10-13

  • demo: cap ClickHouse CPU and switch off its own system logs

v0.3.208 -- 2026-10-13

v0.3.208 — 2026-10-13

  • ci: pin the Go image to 1.27.2 and golangci-lint to v2.14.0
  • engine: the failed-compile WASM test gets its own factory
  • sink: http and otlp test sinks get their own transport

v0.3.207 -- 2026-10-12

v0.3.207 — 2026-10-12

  • adr: 034, Nautobot inventory enters as a compiler frontend

v0.3.206 -- 2026-09-20

v0.3.206 — 2026-09-20

  • bench: comparison harness against Nagios Core, Naemon and Icinga 2
  • bench: comparison harness fixes from the first container runs
  • bench: count executed checks for Nagios and Naemon, not distinct objects
  • bench: comparison records stable memory beside the peak
  • site: benchmarks page compares jaque with Nagios Core, Naemon and Icinga 2
  • backlog: three findings from the comparison benchmarks

v0.3.205 -- 2026-09-20

v0.3.205 — 2026-09-20

  • site: benchmarks page carries the full matrix re-run, memory included

v0.3.204 -- 2026-09-20

v0.3.204 — 2026-09-20

  • design: bench comparison against the Nagios lineage, and backlog F14

v0.3.203 -- 2026-09-20

v0.3.203 — 2026-09-20

  • site: benchmarks page drops a memory column measured before the load fix

v0.3.202 -- 2026-09-20

v0.3.202 — 2026-09-20

  • design: market research of 2026-09-20
  • landing: a contact address, and no declared price
  • site: publish the benchmarks (F11)
  • site: benchmarks page reads in GiB and drops the audit reference

v0.3.201 -- 2026-09-19

v0.3.201 — 2026-09-19

  • roadmap: horizon 4, the agent estate

v0.3.200 -- 2026-09-19

v0.3.200 — 2026-09-19

  • backlog: F13, a sink password has nowhere to live but the config

v0.3.199 -- 2026-09-18

v0.3.199 — 2026-09-18

  • plan: b1-10-an-engine-loses-an-object-while-the-memb frozen
  • coordination: List reads keys from one stream snapshot
  • backlog: B1.10 done

v0.3.198 -- 2026-09-18

v0.3.198 — 2026-09-18

  • backlog: F12, first notification delay

v0.3.197 -- 2026-09-18

v0.3.197 — 2026-09-18

  • backlog: B1.10, an engine loses an object while the membership is unchanged

v0.3.196 -- 2026-09-18

v0.3.196 — 2026-09-18

  • plan: b1-9-a-lost-cadence-anchor-turns-one-check-in frozen
  • sched: NextAt restarts the cadence when its anchor is lost
  • engine: a result settled after losing ownership re-arms nothing
  • backlog: B1.9 done

v0.3.195 -- 2026-09-18

v0.3.195 — 2026-09-18

  • backlog: B1.9, a lost cadence anchor turns one check into a storm

v0.3.194 -- 2026-09-15

v0.3.194 — 2026-09-15

  • plan: f10-stop-checks-or-flap-detection-without-a frozen
  • docs: program and object toggles design
  • eventlog: program and object toggle facts folded into the projection
  • command: SetProgramToggle and SetObjectToggle with their Nagios verbs
  • engine: program and object toggles gate active checks and flap detection
  • eventhandler: program and object toggles skip a firing, seeded from the snapshot
  • fix: graph jaque_eventhandler_disabled_total on the dashboard
  • api: SetProgramToggle and SetObjectToggle on the command and aggregator services
  • fix: regenerate the eventlog easyjson codec as go generate writes it
  • livestatus: status and object columns read the program and object toggles
  • review: toKind keeps its own doc comment
  • review: FoldProgram's program-toggle cases assert the disabled state
  • review: command and engine doc comments name the toggle variants
  • backlog: F10 done
  • roadmap-loop: the full gate reuses a green receipt for HEAD and lets verify-receipts decide

v0.3.193 -- 2026-09-15

v0.3.193 — 2026-09-15

  • backlog: F11, publish the benchmarks

v0.3.192 -- 2026-09-15

v0.3.192 — 2026-09-15

  • plan: b4-5-rebalance-and-countowned-sort-every-obje frozen
  • plan: b4-5 the listener still fires on a heartbeat view
  • plan: b4-5 Changed tells a heartbeat from a rebalance before any walk
  • engine: a membership view with the same members records the epoch and skips the rebalance
  • state: Objects sorts its ids once at construction
  • docs: config bench after the heartbeat rebalance fix
  • backlog: B4.5 done

v0.3.191 -- 2026-09-15

v0.3.191 — 2026-09-15

  • plan: b4-6-loading-a-50000-object-config-peaks-at-8 frozen
  • roadmap-loop: freeze ignores .claude/ like every other gate
  • roadmap-loop: freeze and adopt accept a plan already committed
  • config: #Check selects its branch by type instead of unifying all ten
  • plan: b4-6 step 2 reads the cells' first scrape and run.log
  • config: the bench fixture writes with Fprintf
  • docs: config load after the check schema change
  • backlog: B4.6 done

v0.3.190 -- 2026-09-15

v0.3.190 — 2026-09-15

  • design: the engine decides, a committer writes (B4.4)
  • design: commit contract refined (Submit returns durable decisions, capacities, shutdown)
  • commit: a committer makes decisions durable, one flush per decision or per batch
  • commit: batched events carry the payload's At like Append's do
  • iter tests-quality 1: Extract startBatchedRunLoop helper to dedupe RunLoop goroutine setup
  • iter tests-coverage 1: Cover RunLoop close/ctx-done linger paths and flush Writer/Write error paths
  • process: /roadmap-loop ported from mesa, one reviewer over the deterministic gates
  • plan: b4-4-the-engine-commits-one-decision-per-fsyn adopted
  • commit: format batched.go
  • engine: the loop submits decisions to a committer and settles them once durable
  • cmd/jaque: -commit selects how decisions reach the log, batched by default
  • grafana: commit batch size and queue depth panels
  • design: D5 records the two shutdown holes the review found and their fix
  • review: the loop settles while it submits, and a closed committer still takes the shutdown tail
  • engine: the shutdown commit tests assert the committer's RunLoop result
  • design: D5 records the drained backlog and the drained release on every exit
  • review: drained released on every committer exit, and the loop settles drained decisions from a backlog
  • design: D5 rewrapped
  • review: shutdown settles the backlog before each decision it takes off Committed
  • roadmap-loop: the full gate ticks the item before the receipt, ship only pushes
  • bench: params accept the jaque_flags line bench.sh writes
  • docs: bench after group commit, batched against sync at 50000 objects
  • roadmap-loop: wait for the MR pipeline before merging, ignore .claude/ in the dirty check, read the item id from the right field

v0.3.189 -- 2026-09-14

v0.3.189 — 2026-09-14

  • roadmap: landing pass against inspomcp.dev

v0.3.188 -- 2026-09-14

v0.3.188 — 2026-09-14

  • backlog: name the log mutex, the rebalance churn and the CUE load peak

v0.3.187 -- 2026-09-14

v0.3.187 — 2026-09-14

  • design: bench and soak baseline (B4.3)
  • cmd/jaque: -pprof mounts the runtime profiling endpoints on -listen, off by default
  • scripts: bench.sh runs one soak cell against a synthetic estate and keeps its artifacts
  • bench.sh: wait up to 900s for /healthz, a 50k config takes time to load and replay
  • design: bench sanity counts executed checks, the worker counters never appear standalone
  • bench: summarize a soak cell's artifacts into summary.json and assert the run was sane
  • docs: bench baseline 2026-09-14, ADR-004 results and ADR-010 trigger checked
  • docs: bench report notes resident memory per object, B4.6 in the backlog
  • review: one exported type per file in bench, tests follow their sources, pprof paragraph in three sentences

v0.3.186 -- 2026-09-14

v0.3.186 — 2026-09-14

  • livestatus: the status table reads event handlers, flap detection and freshness from the config
  • iter tests-coverage 1: Cover anyFlapEnabled services-true branch
  • livestatus: hosts and services report active, passive, flap and event handler flags
  • docs: livestatus flag columns, B1.7 closed, program toggles listed as F10
  • docs: one column group per sentence on the livestatus page

v0.3.185 -- 2026-09-14

v0.3.185 — 2026-09-14

  • design: SLA as a product (backlog F9)
  • sla: availability and error budget as a pure computation over fetched intervals
  • iter tests-coverage 1: Cover objectMembers, Compute clamp, and openSpans branches
  • proto: ListSLOs, QuerySLOReport, and coverage fields on availability rows
  • datasource: one state-interval fetch, with availability and timeline computed by sla
  • iter tests-coverage 1: Cover unreachable, downtime, dataFrom scan/rows error paths
  • config: the slo block, and ui.availability requires an events sink on the same database
  • iter tests-coverage 1: Cover newAvailabilitySpec/newSLOs error branches
  • api: ListSLOs and QuerySLOReport over sla.Compute
  • iter tests-coverage 1: Cover QuerySLOReport's DataFromMs non-zero branch
  • ui: SLOs listed in the availability view, with attained, budget and members
  • docs: the SLA page, and the availability view's SLO list
  • review: split sla rows file, empty SLO reports no rows, voice fixes on the SLA page
  • test: the ClickHouse integration test fetches intervals and computes through sla

v0.3.184 -- 2026-09-13

v0.3.184 — 2026-09-13

  • design: Livestatus log table and COMMAND verb, ADR-033
  • livestatus: COMMAND is the second arm of a request sum, handed to a command sink
  • iter tests-coverage 1: Cover livestatus parse/handler error and write-failure paths
  • extcmd: Submitter audits and forwards one Livestatus COMMAND line
  • livestatus: the log table reads a bounded ring the event log fills, plus audit records as class 5
  • wiring: -livestatus-log-cache, the log follower and the COMMAND sink, with jaque_livestatus_commands_total
  • test: cover run()'s -livestatus-socket wiring
  • docs: the Livestatus log table and COMMAND verb, ADR-033
  • review: newXxxEntry constructors, prefixed audit sentinel, ack-cleared row text

v0.3.183 -- 2026-09-13

v0.3.183 — 2026-09-13

  • docs: event handlers join the consumer row of the architecture diagram

v0.3.182 -- 2026-09-13

v0.3.182 — 2026-09-13

  • state: HandlerTrigger derived from a state change
  • iter tests-coverage 1: Add coverage for HandlerTrigger.String and UnmarshalText error path
  • design: event handlers as a log-following role
  • eventlog: HandlerExecuted, the audit fact of an event-handler run
  • iter tests-coverage 1: Add decode/encode error-path coverage for HandlerExecuted status and trigger
  • macro: RuntimeVars replaces NotificationVars; TimeVars shared by both dispatch paths
  • config: handlers and event_handlers blocks resolved per object
  • iter tests-coverage 1: Cover newHandler/newHandlerSpec error paths, HandlerSpec marker methods
  • eventhandler: a log-following role that runs an object's handlers and records each run
  • iter tests-coverage 1: Cover eventhandler gaps: default payload, no-trigger, append error, ctx cancel, WithMacros, command expansion errors
  • wiring: -target eventhandler, embedded in all and engine, reload tee, read-only refusal
  • test: cover flagValue's new event-handler flag branches
  • importer: event_handler, event_handler_enabled and the main-config handler directives onto handlers
  • iter tests-coverage 1: Cover buildEventHandlers' event_handler_timeout parse error
  • docs: event handlers page, ADR-032, target and flags, importer mapping; backlog F7
  • review: newFiring constructor, voice rewrites, test lint and format
  • dashboard: event handlers row with runs by outcome, blocked and fenced
  • eventlog: easyjson codec as just generate emits it

v0.3.181 -- 2026-09-13

v0.3.181 — 2026-09-13

  • design: explicit dependencies with failure criteria (F1)
  • bp: Dependency with failure criteria and its pure evaluator
  • iter tests-coverage 1: Cover composite pending-leaf loop in EvaluateDependency
  • notify: dependency gate after reachability, ReasonDependency
  • config: dependencies block compiled to bp.Dependency per dependent
  • iter tests-coverage 1: Add tests for dependency error branches and WithDependencies
  • engine: failed dependencies feed the notify condition; reload swaps them
  • iter tests-coverage 1: Add dependencySource branch-coverage tests
  • importer: hostdependency and servicedependency onto the dependencies block
  • iter tests-coverage 1: Add coverage for buildServiceDependency/expandServiceTargets gaps
  • docs: dependencies page, suppression order, importer mapping; backlog F1 and B2.2
  • bp, engine, docs: review findings for dependencies
  • notify: golines on evaluate_test.go
  • importer: accept the _options spelling of dependency failure criteria; corpus goldens

v0.3.180 -- 2026-09-12

v0.3.180 — 2026-09-12

  • design: downtime kinds (flexible, triggered, recurring)
  • calendar: OpenedAt, the start of the open block containing t
  • notify: downtime kinds as a closed set; DowntimeStarted and the two schedule payloads
  • iter tests-coverage 1: Cover OpenedAt deadline exit, downtime Window(), active-flexible snapshot, suppression not-found
  • command: flexible and triggered downtime verbs; the FIFO parses Nagios's fixed and trigger_id
  • iter tests-coverage 1: Cover codec Encode/Decode downtime-kind selector and bad-body branches
  • config: recurring downtimes resolved from a timeperiod and a selector
  • iter tests-coverage 1: Add WithDowntimes coverage to configtest table
  • engine: downtimes take effect as DowntimeStarted; flexible, triggered and recurring boundaries
  • iter tests-coverage 1: Add coverage for engine downtime timer arming/cascade edge branches
  • api: downtime kinds on ScheduleDowntime and Downtime
  • iter tests-coverage 1: Add coverage for toObjectStatus recurring occurrence never-opens branch
  • livestatus: downtime kinds, recurring occurrences, depth counts what is in effect
  • iter tests-coverage 1: Cover newDowntimesTable's recurring-downtime skip branch
  • ui: downtime kinds on the downtimes view and a flexible form
  • docs: downtime kinds
  • notify: export Active; deterministic cascade order; DowntimeMeta in its own file

v0.3.179 -- 2026-09-12

v0.3.179 — 2026-09-12

  • docs: design for timeperiods (F3)
  • calendar: named timeperiods with date exceptions, exclusions and a zone
  • iter tests-quality 1: Dedupe range literals; fold DST fall-back case into table
  • config: named timeperiods replace inline windows; check_period, level and contact periods
  • tests: cover named-timeperiod error paths and emission branches
  • engine: check_period defers the next occurrence to the period's next open instant
  • iter tests-coverage 1: Cover armObject/reschedule never-opens branches
  • importer: timeperiods map 1:1, with check_period, escalation_period and contact periods
  • iter tests-coverage 1: Cover WithTimezone option, newBuildResult opts loop, check_period, notification_period
  • api: check_period and notification_period on ObjectStatus
  • livestatus: timeperiods table and period columns on hosts, services and contacts
  • iter tests-coverage 1: livestatus: cover NewTables
  • ui: the object row names its check and notification periods
  • ui: the Check section is visible to every reader; only Recheck now stays behind the command gate
  • docs: timeperiods across config, notifications, importer, Livestatus, API and dashboard
  • fmt: golines over the timeperiods block
  • review: restate the no-wrap rule, reword check_period's empty value, drop dead plumbing in the emitter

v0.3.178 -- 2026-09-12

v0.3.178 — 2026-09-12

  • docs: design for user comments (F2b)
  • command: AddComment, DeleteComment and the ADD_COMMENT/DEL_COMMENT FIFO verbs
  • iter tests-coverage 1: Cover run's passive-ingest wiring, codec Decode error paths, parseAddComment host branches
  • eventlog: CommentAdded and CommentDeleted, folded onto the object's comments
  • engine: apply AddComment and DeleteComment
  • iter tests-coverage 1: Cover applyAddComment fan-out Append failure
  • api: AddComment returns the id it minted; DeleteComment; comments on ObjectStatus
  • iter tests-coverage 1: Cover AddComment identity branch and runUI's memory path
  • ui: comments on the object row
  • livestatus: user comments on the comments table
  • docs: user comments over the FIFO, the API, the dashboard and Livestatus
  • docs: AddComment takes one object, so it leaves the Target list
  • fmt: golines over the comment block; close the metrics body in TestRunWiresUITarget

v0.3.177 -- 2026-09-11

v0.3.177 — 2026-09-11

  • docs: design for forced rechecks (F2a)
  • command: ScheduleCheck and the SCHEDULE_*_CHECK FIFO verbs
  • iter tests-coverage 1: Add schedule_check codec and parse error-path coverage
  • engine: apply ScheduleCheck without moving the cadence anchor
  • engine: applyScheduleCheckOne has no error to return
  • engine: cover the not-owned forwarding branch of ScheduleCheck
  • api: ScheduleCheck on the command and aggregator services
  • iter tests-coverage 1: Add ScheduleCheck send-failure coverage test
  • ui: Recheck now button on the object row
  • ui: no empty Check section for a viewer who cannot command
  • docs: forced rechecks over the FIFO, the API and the dashboard
  • fmt: golines over the schedule-check tests
  • fixer: fold the ScheduleCheck codec cases into TestCodec, one commit point in reschedule

v0.3.176 -- 2026-09-11

v0.3.176 — 2026-09-11

  • docs: design for runtime notification toggles (F2c)
  • eventlog: ProgramNotificationsSet, ObjectNotificationsSet and ContactNotificationsSet
  • notify: program and object gates, disabled-contact filter (F2c)
  • projection: Program aggregate folded from the notification toggles
  • iter tests-coverage 1: cover compareContactScope return -1 branch
  • command: SetProgramNotifications, SetObjectNotifications, SetContactNotifications and their FIFO verbs
  • extcmd: one parser for the host and service notification toggles, no dead field check
  • engine: apply and fold the notification toggles; snapshot carries the program aggregate
  • api: SetProgramNotifications, SetObjectNotifications and SetContactNotifications on the command and aggregator services
  • iter tests-coverage 1: Cover new SetObjectNotifications/SetProgramNotifications/SetContactNotifications paths
  • livestatus: enable_notifications and notifications_enabled read the projection
  • docs: runtime notification toggles
  • projection: ContactScope in its own file
  • fmt: golines over the notification toggles
  • engine: read the projection only after Run returns in the command ingestion test

v0.3.175 -- 2026-09-10

v0.3.175 — 2026-09-10

  • roadmap: open blocks table carries F5 part 2 and the deliver split

v0.3.174 -- 2026-09-10

v0.3.174 — 2026-09-10

  • deliver: export the render model every adapter shares
  • deliver/route: contact routing leaves the core package
  • deliver/nagios: the exec protocol adapter gets its own package
  • deliver/webhook: own package
  • deliver/email: own package, own default templates
  • deliver/email: the defaults test renders the fixture the deliver test used
  • deliver/telegram: own package, own default templates
  • deliver/slack: own package, own digest text
  • deliver/pagerduty: own package
  • deliver/incidentio: own package; deliver's doc names the split
  • fmt: golines over the deliver split

v0.3.173 -- 2026-09-10

v0.3.173 — 2026-09-10

  • notify: the CUSTOM kind, silenced by a downtime and nothing else
  • command: SEND_CUSTOM_HOST_NOTIFICATION and SEND_CUSTOM_SVC_NOTIFICATION
  • api: SendCustomNotification on the command and aggregator services
  • engine: custom notifications go through the same evaluate path
  • docs: custom notifications
  • roadmap: F5 closed, both parts

v0.3.172 -- 2026-09-10

v0.3.172 — 2026-09-10

  • design: notification kinds as declarations (F5)
  • design: notify kinds traits are three enums, and the Nagios macro spelling
  • notify: KindTraits is the one table the gates, Evaluate and Fold read
  • deliver: PagerDuty and incident.io act on the kind's incident trait
  • notify: ACKNOWLEDGEMENT and the three DOWNTIME kinds, declared by their traits
  • deliver: the notification ID keys on an anchor, and author and comment ride along
  • command: acknowledge carries the notify flag through the FIFO, the API and the dashboard
  • sched: timers carry a key so one object can hold one per downtime window
  • engine: acks and downtime boundaries notify through the same evaluate path
  • importer: notification_options s maps to the downtime kinds
  • importer: the s option leaves no report entry
  • deliver: $NOTIFICATIONTYPE$ carries Nagios's own spellings
  • docs: the notification kinds catalogue, acknowledgement and downtime notifications
  • sched: one Timer constructor, the key is a parameter
  • fmt: golines over the notify kinds block

v0.3.171 -- 2026-09-10

v0.3.171 — 2026-09-10

  • roadmap: phase 4 exit criterion closed on the first real Telegram page

v0.3.170 -- 2026-09-10

v0.3.170 — 2026-09-10

  • roadmap: open blocks table settled as of 2026-09-10

v0.3.169 -- 2026-09-10

v0.3.169 — 2026-09-10

  • package: the deb and the rpm install the licence text
  • pkgs: the licence text sits at the bucket root and the index links it

v0.3.168 -- 2026-09-10

v0.3.168 — 2026-09-10

  • pkgs: build-repos writes an index page for the bucket root
  • harness: build-index cases cover both usage branches and an empty version
  • pkgs: the release job publishes index.html
  • cloudflare: pkgs.jaque.sh root rewrites to index.html

v0.3.167 -- 2026-09-09

v0.3.167 — 2026-09-09

  • receipts: record the check acceptance for c6b5749c
  • quality-pass: refuse to write a receipt when the pre-push gate is not installed
  • claude.md: ledger entry 13, the gate that moved

v0.3.166 -- 2026-09-09

v0.3.166 — 2026-09-09

  • just: fmt-check formats only the files changed since the merge base

v0.3.165 -- 2026-09-09

v0.3.165 — 2026-09-09

  • license: drop the per-file SPDX headers and the spdx-check gate
  • license: proprietary, source not distributed (ADR-031)

v0.3.164 -- 2026-09-09

v0.3.164 — 2026-09-09

  • eventlog: filtered follow reads every type off one snapshot
  • eventlog: wrap the long lines in the snapshot subtest
  • eventlog: release the fresh snapshot when closing the old iterators fails
  • site: legal pages point at [email protected]
  • roadmap: the pkgs cache purge is dropped, the one-minute metadata TTL covers it

v0.3.163 -- 2026-09-09

v0.3.163 — 2026-09-09

  • packages: ship the log server as jaque-log plus the mirrored upstream package
  • roadmap: name the two log server MRs

v0.3.162 -- 2026-09-09

v0.3.162 — 2026-09-09

  • copy: the headline is a record of every move

v0.3.161 -- 2026-09-09

v0.3.161 — 2026-09-09

  • landing: the deployment table, platform by topology

v0.3.160 -- 2026-09-09

v0.3.160 — 2026-09-09

  • helm: opt-in in-cluster log server through the official chart as a subchart

v0.3.159 -- 2026-09-09

v0.3.159 — 2026-09-09

  • grafana: export both dashboards in the sharing format grafana.com accepts

v0.3.158 -- 2026-09-09

v0.3.158 — 2026-09-09

  • site: content/ and landing/ move under site/

v0.3.157 -- 2026-09-09

v0.3.157 — 2026-09-09

  • license: SPDX header on every Go file, kept by spdx-check

v0.3.156 -- 2026-09-09

v0.3.156 — 2026-09-09

  • roadmap: open blocks after the night of 2026-09-09

v0.3.155 -- 2026-09-09

v0.3.155 — 2026-09-09

  • contributing: how to send a change; release: rclone retries the first R2 refusal

v0.3.154 -- 2026-09-08

v0.3.154 — 2026-09-08

  • reorg: the pipeline in .gitlab/ci/, packaging under deploy/, hooks under scripts/

v0.3.153 -- 2026-09-08

v0.3.153 — 2026-09-08

  • ui: /status.json is gone; /healthz answers the probes

v0.3.152 -- 2026-09-08

v0.3.152 — 2026-09-08

  • docs, landing: a copy button on every snippet that is something to type
  • docsgen: the snippet wrapper checks its writes

v0.3.151 -- 2026-09-08

v0.3.151 — 2026-09-08

  • audit: proto changes of the last 30 days, additive or breaking

v0.3.150 -- 2026-09-08

v0.3.150 — 2026-09-08

  • infra: the R2 usage alert goes; its limit never drove what fired

v0.3.149 -- 2026-09-08

v0.3.149 — 2026-09-08

  • docs: open blocks in the roadmap; ADR-002 and 007 say where the log server lives

v0.3.148 -- 2026-09-08

v0.3.148 — 2026-09-08

  • license: AGPL-3.0-only with a contributor license agreement (ADR-030)
  • license: the CLA names Parsecode Labs, S.L., with the founder as grantee until it is registered
  • license: reflow the CLA opening

v0.3.147 -- 2026-09-08

v0.3.147 — 2026-09-08

  • docs: production-ready everywhere, with terms and privacy pages

v0.3.146 -- 2026-09-08

v0.3.146 — 2026-09-08

  • voice: the rule for the public prose, the gate for the part a pattern can catch, and its reviewer
  • docs: deployment in the voice of docs/VOICE.md
  • docs: concepts, observability and ui in the voice of docs/VOICE.md
  • docs: notifications, reference, api and config in the voice of docs/VOICE.md
  • docs: get-started, nagios-compat, checks, project, ingest in the voice of docs/VOICE.md
  • voice: the gate joins check-site, and the last four lines the first draft left behind

v0.3.145 -- 2026-09-08

v0.3.145 — 2026-09-08

  • landing: the copy in a plain, unhurried voice

v0.3.144 -- 2026-09-08

v0.3.144 — 2026-09-08

  • landing: one idea per block, the install in the hero, and body copy in the sans

v0.3.143 -- 2026-09-08

v0.3.143 — 2026-09-08

  • deploy: compose, systemd and kubernetes files for one node and for split roles
  • ci: deploy-test brings both compose stacks up and lints the chart values
  • docs: choose your deployment, six guides from a fresh machine to a running jaque

v0.3.142 -- 2026-09-08

v0.3.142 — 2026-09-08

  • grafana: the process dashboard, one row per subsystem, gated against the metrics page
  • docs: the metrics page ships its dashboard

v0.3.141 -- 2026-09-08

v0.3.141 — 2026-09-08

  • site: anchors that name their section, and the social tags the pages were missing
  • docsgen: heading anchors drop the section number, so renumbering breaks no link

v0.3.140 -- 2026-09-08

v0.3.140 — 2026-09-08

  • landing: pkgs.jaque.sh is named, the install page is what gets linked

v0.3.139 -- 2026-09-08

v0.3.139 — 2026-09-08

  • deploy: the R2 alert is a share of the free storage, and bin/ keeps ten versions

v0.3.138 -- 2026-09-08

v0.3.138 — 2026-09-08

  • site: the install story replaces the hand-delivery sentence

v0.3.137 -- 2026-09-08

v0.3.137 — 2026-09-08

  • deploy: the metadata cache rule goes last, so its one-minute TTL wins

v0.3.136 -- 2026-09-08

v0.3.136 — 2026-09-08

  • release: goreleaser reads the notes file again, and the v0.3.134 entry

v0.3.135 -- 2026-09-07

v0.3.135 — 2026-09-07

  • changelog: entries generated from the tags, backfilled to v0.3.133
  • ci: the tag job commits the changelog entry and tags that commit
  • release: the release body is the changelog entry, with the install line and the signing identity

v0.3.134 -- 2026-09-07

v0.3.134 — 2026-09-07

  • packaging: bin/ carries the release files only, and the version directory is synced

v0.3.133 -- 2026-09-07

v0.3.133 — 2026-09-07

  • packaging: apt and yum repository tree, install.sh, and the local end-to-end install test
  • ci: the release job publishes pkgs.jaque.sh and package-test installs from it
  • docs: install page for pkgs.jaque.sh, and the quickstart stops handing the binary over

v0.3.132 -- 2026-09-07

v0.3.132 — 2026-09-07

  • demo: healthcheck probes the service name, not loopback

v0.3.131 -- 2026-09-07

v0.3.131 — 2026-09-07

  • deploy: pkgs.jaque.sh bucket, domain, cache, rate limit and budget alert as Terraform
  • ci: terraform plan on MR and apply on main for deploy/cloudflare
  • deploy: one R2 usage alert per product, as the API requires

v0.3.130 -- 2026-09-07

v0.3.130 — 2026-09-07

  • ci: package-test feeds packages over stdin and names the downloads explicitly

v0.3.129 -- 2026-09-07

v0.3.129 — 2026-09-07

  • ci: package-test picks the runner's architecture and stops on the first failure

v0.3.128 -- 2026-09-07

v0.3.128 — 2026-09-07

  • packaging: deb, rpm and apk with unit, env file, user, dirs and sysctl
  • ci: install the tag's deb and rpm in containers and run jaque version
  • ci: the in-container package checks fail on the first failing line
  • docs: operations page covers upgrading a packaged install
  • ci: package-test script as a block scalar so its curl header parses as a string

v0.3.127 -- 2026-09-07

v0.3.127 — 2026-09-07

  • release: cosign writes a Sigstore bundle, the only output cosign 3 accepts

v0.3.126 -- 2026-09-07

v0.3.126 — 2026-09-07

  • release: ignore the CI cache directories goreleaser called a dirty tree

v0.3.125 -- 2026-09-07

v0.3.125 — 2026-09-07

  • release: sign in with the job token, which a tag pipeline actually has

v0.3.124 -- 2026-09-07

v0.3.124 — 2026-09-07

  • cmd: jaque version prints the stamped version, commit and build date
  • release: goreleaser builds, signs and publishes the tag's archives
  • iter tests-coverage 1: Cover runVersion's write-error branch

v0.3.123 -- 2026-09-07

v0.3.123 — 2026-09-07

  • docs: packaging and distribution design record

v0.3.122 -- 2026-09-07

v0.3.122 — 2026-09-07

  • docs: the verification page speaks to the reader, and the prose gate refuses source files, build commands and goroutines
  • docs: the verification page shows the invariant, a fence, a configuration and the counterexample trace

v0.3.121 -- 2026-09-07

v0.3.121 — 2026-09-07

  • docs: how it is verified, the two bugs the model checker found, and the properties the core is tested against

v0.3.120 -- 2026-09-07

v0.3.120 — 2026-09-07

  • api: AdminService.ListAuditRecords serves the audit trail
  • docs: ListAuditRecords on the admin service and audit log pages
  • command: Target marshals to JSON as its object or selector so the audit log keeps it

v0.3.119 -- 2026-09-07

v0.3.119 — 2026-09-07

  • justfile: just check runs the cheap gates first so a format or lint slip fails in a minute
  • justfile: vet and lint follow web-build, whose dist they embed

v0.3.118 -- 2026-09-07

v0.3.118 — 2026-09-07

  • audit: a second log for commands at the process boundary, memory ring and rotating file
  • api, extcmd: every command at the boundary is written to the audit log before it is forwarded or refused
  • command, eventlog: a deleted downtime carries the author that deleted it
  • cmd/jaque: -audit and -audit-retention wire the audit log; metrics, docs page and ADR-029
  • iter tests-coverage 1: Add tests for audit-log error branches uncovered by the command audit log block
  • audit: records marshal with the documented keys; one rejected-record helper
  • format
  • tests: the streaming-handler interceptor test asserts its error
  • tests: the file log's permission-denial subtests skip under root, where chmod denies nothing (CI runs as root)

v0.3.117 -- 2026-09-07

v0.3.117 — 2026-09-07

  • eventlog: Position names the payload types a read wants; memory and file honour it
  • eventlog: the file transport keeps a per-type index; filtered reads and compaction never decode what they skip
  • eventlog: the shared server transport publishes one subject per payload type and filters server-side
  • notifier, sink: the followers that fold few types read only those; docs and the transport design amended
  • tests: filtered follow, duplicate types, stale index and multi-batch build on the type index
  • eventlog: a filtered stream reports what it scanned past; the follower's AppliedSeq folds it in
  • notifier: the Consumer keeps no cursor of its own; the Follower's is the one the supervisor drains
  • tests: the filtered-follow index tests get a 60s bound; 50 fsynced appends under the full -race suite overran 5s

v0.3.116 -- 2026-09-07

v0.3.116 — 2026-09-07

  • cmdbus: the bus and the ingress count what they forward and receive
  • work: the worker counts every request it handled, by zone and outcome
  • sink, livestatus: the manager and the server observe their own lifecycles
  • eventlog: the follower reports what it applied; the observability allowlist keeps only the migrator
  • iter tests-coverage 1: Close coverage gaps: noop observers, HandleConn write_error, worker reply_error branches
  • work: the worker observer is private and speaks Observe like its siblings

v0.3.115 -- 2026-09-07

v0.3.115 — 2026-09-07

  • design: command audit log and payload-type filter, proposed

v0.3.114 -- 2026-09-07

v0.3.114 — 2026-09-07

  • eventlog: Append takes a batch under one stamp; memory and file commit it as one write
  • engine: a decision is appended as one write; ADR-002 and the docs say what each transport promises
  • iter tests-coverage 1: Add tests for eventlog closed/empty-flush/Err/error-join branches
  • engine: reachabilityFacts, in the file's naming family

v0.3.113 -- 2026-09-07

v0.3.113 — 2026-09-07

  • config: Generation hashes the sorted object identities a config declares
  • eventlog: ConfigReloaded carries the config generation it applied
  • engine: the loop folds the log's config generation and holds its submits while it differs from its own
  • cmd/jaque: boot records the config generation on the log; docs and ADR-015 D2 amended
  • tests: generation fence fixture; WithGeneration and boot-record error branch covered

v0.3.112 -- 2026-09-06

v0.3.112 — 2026-09-06

  • metrics: jaque_notifier_fenced_total counts deliveries held by the notifier epoch fence
  • notifier: an owned request stamped newer than the ownership view is fenced until a Refresh levels it
  • cmd/jaque: both notifier ownership gates report their epoch; ADR-015 D6 amended for the fence
  • iter tests-coverage 1: Add tests for engineOwnership.Epoch, noopObserver.ObserveNotifierFenced, alwaysOwns.Epoch

v0.3.111 -- 2026-09-06

v0.3.111 — 2026-09-06

  • design: notifier epoch fence and config generation, proposed
  • design: atomic append, proposed

v0.3.110 -- 2026-09-06

v0.3.110 — 2026-09-06

  • work: a wire-version mismatch is nak'd so a compatible worker can take it
  • exec: Pool.Acquire bounds the gate wait with a deadline; Run is built on it
  • work: the worker answers UNKNOWN when a request cannot start within its timeout
  • backlog: B6.4 closed; the abandoned-timer clause struck with Go 1.23 evidence
  • exec: a deadline at the global gate must release the host slot it holds

v0.3.109 -- 2026-09-06

v0.3.109 — 2026-09-06

  • api: a cardinality guard pins the proto Status enum to state.Status
  • gates: generate-check regenerates proto output and fails on drift
  • eventlog: export the event type table; eventdump aliases it
  • api: format the cardinality guard

v0.3.108 -- 2026-09-06

v0.3.108 — 2026-09-06

  • engine: snapshot writes, restores and refusals reach a snapshotObserver
  • metrics: six snapshot series on the Recorder
  • metrics: engine and ui export snapshot series; reference documents them
  • gates: observability-check keeps core components observed and every series documented
  • engine: LoadSnapshot reports the restored seq once, after the decision
  • engine, metrics: format the new snapshot observer tests

v0.3.107 -- 2026-09-06

v0.3.107 — 2026-09-06

  • logging: lol.Logger with typed fields replaces *slog.Logger
  • logging: decide the suppressed-notification level once, test the new seams
  • logging: lol/v2/zerolog v0.1.1, colour only at a terminal

v0.3.106 -- 2026-09-06

v0.3.106 — 2026-09-06

  • eventlog: every appended event carries its writer beside the epoch
  • engine: the tail skips only this engine's own records, and a loop behind the log does not write
  • docs: the handover protocol is model-checked, and the site says so
  • eventlog: pin the writer stamp on the wire both ways

v0.3.105 -- 2026-09-06

v0.3.105 — 2026-09-06

  • formal: ADR-015 ownership and epoch fence as a TLA+ model

v0.3.104 -- 2026-09-06

v0.3.104 — 2026-09-06

  • engine: every fact the loop appends is folded into the projection
  • lifecycle: a service that dies on its own ends the process
  • config, api: refuse the inputs that used to be rewritten silently
  • sink: a batch the destination rejects is a write error, not a warn line
  • reload, worker: validate the whole config on reload; compile a WASM module once
  • engine: a retired object releases its timer, epoch and hard status
  • docs: structural invariants re-verified; B6 rewritten to what survived
  • cmd: keep membershipWiring's doc comment on its struct
  • cmd, engine: cover waitUntilStopped and the uncached WASM compile failure

v0.3.103 -- 2026-09-06

v0.3.103 — 2026-09-06

  • chart: the ServiceMonitor scrapes only the metrics Service

v0.3.102 -- 2026-09-05

v0.3.102 — 2026-09-05

  • clickhouse: one version everywhere, the 26.8 LTS

v0.3.101 -- 2026-09-05

v0.3.101 — 2026-09-05

  • datasource: downtime overlap joins on object only, ranges in WHERE

v0.3.100 -- 2026-09-05

v0.3.100 — 2026-09-05

  • demo: the state history sink feeds the availability view
  • demo: the event log tmpfs keeps mode 1777 across restarts

v0.3.99 -- 2026-09-05

v0.3.99 — 2026-09-05

  • datasource: a ClickHouse datasource authenticates with its url's credentials

v0.3.98 -- 2026-09-05

v0.3.98 — 2026-09-05

  • demo: enable the availability view

v0.3.97 -- 2026-09-05

v0.3.97 — 2026-09-05

  • eventlog: snapshot store on every transport
  • eventlog: a file snapshot survives reopen, pinned
  • eventlog: a nats snapshot survives a broker restart, pinned
  • engine: replay restores from a snapshot, folds the rest
  • engine: Snapshotter folds the log and writes the snapshot
  • cmd: the engine writes the snapshot, the ui and livestatus restore from it
  • engine: equivalence of snapshot restore and full replay, pinned
  • docs: snapshots on the site, design decision 3 amended
  • engine: newSnapshotSeed, ReplaySeed.Apply removed

v0.3.96 -- 2026-09-05

v0.3.96 — 2026-09-05

  • docs: projection snapshots design, draft for review
  • docs: projection snapshots accepted, ADR-028
  • docs: audit log decided, queued behind snapshots

v0.3.95 -- 2026-09-05

v0.3.95 — 2026-09-05

  • projection: Get is the point lookup on the read model
  • api: one-object requests use the read model's Get
  • docs: B4.2 closed, point lookups on the read model

v0.3.94 -- 2026-09-05

v0.3.94 — 2026-09-05

  • docs: B3.10 amended and closed, TTL is not the tool for replayed facts

v0.3.93 -- 2026-09-04

v0.3.93 — 2026-09-04

  • projection: the read model moves out of internal/ui
  • cmd/jaque: no parameter shadows the projection package
  • docs: B3.4 closed, the read model lives in projection
  • cmd/jaque: wrap writeSnapshot signature
  • gen: the Go API bindings move to a public path
  • docs: B3.5 closed, the API bindings are public
  • docs: B3.5 note, the docs page does not name the path
  • docs: design notes point at gen/
  • api: one selectorMembers helper for ListStatus and ListObjects
  • docs: B3.6 amended and closed
  • state: applyFlap gates NotifyEffect only, other effects pass through
  • docs: B3.7 closed, applyFlap gates notifications only
  • state: the applyFlap test file follows transition.go
  • docs: rewrap the B3.7 note
  • notify: Fold is the one definition of how a sent notification advances State
  • engine: replay folds notifications through notify.Fold
  • docs: B3.9 closed, one notification fold

v0.3.92 -- 2026-09-04

v0.3.92 — 2026-09-04

  • config: delete DiffSinks, sinks reconcile by spec hash
  • docs: B3.3 closed, DiffSinks deleted

v0.3.91 -- 2026-09-04

v0.3.91 — 2026-09-04

  • web: the test tree type-checks
  • gates: the SPA type check runs in check and in the web CI job
  • justfile: wrap the web-typecheck comment
  • docs: B2.5 closed, the SPA type check is a gate

v0.3.90 -- 2026-09-04

v0.3.90 — 2026-09-04

  • web: one client module owns the Connect transport
  • web: list modules speak the generated QueryService client
  • web: status, processes and server info on the generated client
  • web: panels and availability on the generated client
  • web: auth and config on the generated clients
  • web: createResource replaces the per-view effect idiom
  • gates: fail the build on a fetch outside the SPA client module
  • docs: B2.4 closed, SPA on the generated clients
  • web: type the diagnostics fixture in config.test.ts

v0.3.89 -- 2026-09-04

v0.3.89 — 2026-09-04

  • command: Verb discriminator and a sum-shaped wire codec
  • iter tests-coverage 1: Cover codec error branches and commandtest.Samples
  • cmdbus: forward commands through command.Encode and Decode
  • iter tests-quality 1: Group TestSamples into subtests for completeness vs verb-field checks
  • extcmd, engine: every verb is routed and folded, by test
  • iter tests-quality 1: Split verb-loop into per-verb t.Run subtests
  • command: Retarget on the targeted variants
  • aggregator: one generic realm-forwarding helper
  • docs: B2.3 closed, command verb registry

v0.3.88 -- 2026-09-04

v0.3.88 — 2026-09-04

  • eventlog: persist the pebble seq counter so an emptied store keeps counting
  • docs: B1.8 closed, pebble seq counter persisted

v0.3.87 -- 2026-09-04

v0.3.87 — 2026-09-04

  • docs: structural invariants audit recorded; B6 backlog section

v0.3.86 -- 2026-09-04

v0.3.86 — 2026-09-04

  • command: Validate holds the downtime invariants on the model
  • iter tests-quality 1: Group TestCommandValidate subtests by command type
  • fmt: golines on command_test.go
  • api, extcmd: validate commands once at each transport's funnel
  • docs: command invariants live in the model; B1.6 closed

v0.3.85 -- 2026-09-04

v0.3.85 — 2026-09-04

  • docs: coordination credentials are root-equivalent; B1.5 closed as by-design

v0.3.84 -- 2026-09-04

v0.3.84 — 2026-09-04

  • proto: aggregator commands get their own service; realm leaves the realm API
  • iter tests-coverage 1: Add unit tests covering new aggregator.pb.go/connect.go generated code
  • Revert "iter tests-coverage 1: Add unit tests covering new aggregator.pb.go/connect.go generated code"
  • fmt: formatted regenerated api stubs
  • aggregator: serve AggregatorCommandService, forwarding wrapped commands including ProcessCheckResult(s)
  • ui: commands route through AggregatorCommandService when a realm is named
  • docs: aggregator command surface split recorded; B1.4 closed
  • receipts: step-1 intermediate acceptances (broken-build midpoint of the surface split)

v0.3.83 -- 2026-09-03

v0.3.83 — 2026-09-03

  • proto: QueryAvailability accepts down_statuses; AvailabilityRow reports undetermined_seconds
  • iter tests-coverage 1: Add getter coverage for query.pb.go
  • Revert "iter tests-coverage 1: Add getter coverage for query.pb.go"
  • datasource: availability request takes DownStatuses; row reports UndeterminedSeconds
  • datasource/clickhouse: availability agrees with the domain (IsProblem default, unreachable wins, determined denominator)
  • iter tests-coverage 1: Cover mergeRanges, overlapSeconds and QueryAvailability error/edge branches
  • fmt: availability coverage tests
  • api: QueryAvailability maps down_statuses (PENDING rejected) and undetermined_seconds
  • iter tests-coverage 1: Add TestToDownStatuses covering error path
  • fmt: toDownStatuses coverage test
  • docs: availability semantics follow the domain; B1.3 closed
  • docs: undetermined time covers data gaps, not only PENDING

v0.3.82 -- 2026-09-03

v0.3.82 — 2026-09-03

  • build: just check lints every surface CI lints (lint-all), with parity guarded in harness-test
  • build: proto-check gates status-shaped string fields; proto drafts cite existing types (rule 8)

v0.3.81 -- 2026-09-03

v0.3.81 — 2026-09-03

  • build: go 1.27.1, golangci-lint v2.13.2
  • exec: warm wazero's version cache in TestMain to dodge its init race
  • test: index the sink ownership CUE Sprintf args so SA5009 can count them

v0.3.80 -- 2026-09-03

v0.3.80 — 2026-09-03

  • sched: generic keyed heap; TimerQueue with (object, kind) timers
  • iter tests-coverage 1: Cover TimerKind.String and keyedHeap Push/pop edge branches
  • notify: re-notifications get distinct NotificationIDs (count in the ID)
  • engine: update NewNotificationID call site in replay test (count argument)
  • deliver: Requester doc reflects count in the dedup key
  • notify: gofmt/golines on step-2 test files
  • iter tests-quality 1: Extract requireSuppressedByKind helper, dedupe ack/unreachability tests
  • engine: domain timers drive re-notification and period-reopen (B1.2, B2.1)
  • iter tests-quality 1: No changes
  • iter tests-coverage 1: Add tests for fireTimer/armNotifyTimer guards and Run's arm-selection switch
  • docs: re-notification and period-reopen are timer-driven; B1.2/B2.1 closed
  • docs: tighten the re-notify cadence sentence in state-model

v0.3.79 -- 2026-09-03

v0.3.79 — 2026-09-03

  • notify: suppression conditions as ordered gates; reachability suppresses problem-class kinds
  • iter tests-coverage 1: Cover ReasonUnreachable in TestReasonString
  • docs: dependency notification suppression is real; backlog B1.1/B3.8 closed
  • docs: correct B3.8 closing note (Suppression stays; Apply and duplicated State fields are what went)

v0.3.78 -- 2026-09-03

v0.3.78 — 2026-09-03

  • docs: stop claiming dependency notification suppression; refresh CLAUDE.md layout (B3.1, B3.2)

v0.3.77 -- 2026-09-03

v0.3.77 — 2026-09-03

  • docs: audit backlog (2026-09-03) + session rules for backlog and proto changes

v0.3.76 -- 2026-09-03

v0.3.76 — 2026-09-03

  • ui: palette covers every navbar section, enforced by test

v0.3.75 -- 2026-09-02

v0.3.75 — 2026-09-02

  • ui: budget the x axis into the availability timeline height

v0.3.74 -- 2026-09-02

v0.3.74 — 2026-09-02

  • ui: interactive availability timeline (hover detail + drag-to-zoom)
  • ui: drag coordinates relative to the timeline container, not the hovered interval
  • ui: availability timeline axis, cursor tooltip and drag readout
  • ui: availability timeline on uPlot (native axis, select-to-zoom, cursor tooltip)

v0.3.73 -- 2026-09-02

v0.3.73 — 2026-09-02

  • datasource: availability and state-timeline queries over state history
  • iter tests-quality 1: DRY: extract newTestAvailConnErr and newTestAvailWindow helpers
  • api: QueryAvailability and QueryObjectTimeline over the availability datasource
  • iter tests-coverage 1: Cover QueryObjectTimeline/resolveAvailabilityQuerier error paths
  • ui: availability view with uptime, breakdown and state timeline
  • docs: document the availability view and check its roadmap box
  • docs: point the availability example ds at the datasources block
  • fmt: golines on clickhouse_availability_test
  • lint: convert rawAvailability to AvailabilitySpec directly
  • datasource: move backend implementations into subpackages
  • iter tests-coverage 1: Add TestNewDatasourceBuilder covering builder dispatch
  • fmt: golines on the datasource subpackages

v0.3.72 -- 2026-09-02

v0.3.72 — 2026-09-02

  • cmd/jaque: add the migrate subcommand applying sink schemas out-of-band
  • iter tests-quality 1: migrate_test: assert the load error names the missing config path
  • docs: document jaque migrate and check its roadmap box
  • sink: observe write latency, batch size and applied time on both forwarders
  • metrics: sink write duration and rows series, per-follower applied-time gauge
  • docs: document the sink write and applied-time series

v0.3.71 -- 2026-09-02

v0.3.71 — 2026-09-02

  • sink: move the clickhouse backends into sink/clickhouse, dissolve factory
  • sink/clickhouse: comments stop pointing at the dissolved factory
  • sink: move the jsonl backends into per-backend subpackages
  • iter tests-coverage 1: sink: cover exec/file/http/otlp/jsonl error paths
  • sink: move remote-write into sink/remotewrite
  • iter tests-coverage 1: cover cursor_file, remotewrite Write/persistCursor error paths and malformed ObjectID
  • docs: adr-009 amendment for the sink subpackage layout
  • sink: golines the moved backends
  • sink/remotewrite: errFoo naming for the test error var
  • sink/file: skip the rename-failure test under root

v0.3.70 -- 2026-09-01

v0.3.70 — 2026-09-01

  • sink: extract the event->row fold into neutral row types
  • docs: bound insert frequency and note async_insert in state-history
  • docs: async_insert coalesces into fewer, larger inserts
  • sink: golines the LastSeq query arguments

v0.3.69 -- 2026-09-01

v0.3.69 — 2026-09-01

  • sink: ClickHouseEvents writes state_changed, downtime and reachability_changed
  • iter tests-quality 1: Extract fixtures/helpers, split integration test into subtests
  • config+wiring: clickhouse sinks accept input events
  • docs: state history page, SLA reference queries, roadmap split
  • docs: leadInFrame needs an explicit frame in the state-history queries
  • sink: gofmt the events integration test
  • receipts: track the coverage acceptance for b054dc9

v0.3.68 -- 2026-09-01

v0.3.68 — 2026-09-01

  • chore: track the coverage acceptances for 378e96f and c0fca88

v0.3.67 -- 2026-09-01

v0.3.67 — 2026-09-01

  • docs: ADR-027 (analytics history is a sink concern) + frozen plan for the ClickHouse events sink

v0.3.66 -- 2026-09-01

v0.3.66 — 2026-09-01

  • config: group_wait on digestable contacts only (N4 step 1)
  • deliver: BatchAdapter and digest rendering (N4 step 2)
  • deliver: grouper + dispatcher + RunGroupLoop (N4 step 3)
  • deliver: inject logger into Dispatcher; wire RunGroupLoop; N4 docs (N4 step 4)
  • deliver: rename testGroupLogger to newTestGroupLogger, bound drainTestNotify
  • engine: apply an already-received result under WithoutCancel

v0.3.65 -- 2026-09-01

v0.3.65 — 2026-09-01

  • config: pagerduty, slack and incident.io contact types
  • deliver: alert key and the PagerDuty Events v2 adapter
  • deliver: Slack incoming-webhook adapter
  • deliver, appconfig: incident.io adapter and its process-secret token
  • deliver, docs: route the three incident-platform contacts
  • deliver: golines the three new adapters
  • deliver: use utf8.RuneStart and time.RFC3339 in the PagerDuty adapter
  • deliver, config: cover the new contact kinds and the 5xx and malformed-URL paths

v0.3.64 -- 2026-09-01

v0.3.64 — 2026-09-01

  • eventlog: carry status, output, perfdata and problem start on NotificationRequested
  • deliver: carry the runtime payload on Request, Pending and Delivery
  • engine, notifier: populate and carry the runtime notification payload
  • deliver: expand the Nagios runtime macros at dispatch time
  • deliver, docs: runtime fields on the webhook body and the macro reference
  • deliver: gofmt the runtime-macro table test
  • deliver: format the runtime-macro table test
  • deliver: TemplateData and the default notification templates
  • config: per-contact notification template overrides
  • deliver: render real email headers and a templated body
  • deliver: render the Telegram message from a template
  • deliver, docs: per-contact template wiring, adapter docs, roadmap
  • deliver: quality-pass fixes — wrap the QUIT error, drop duplicated template literals, assert off the handler goroutine
  • deliver, config: close coverage gaps in email delivery and template validation
  • roadmap: EmailAdapter.Deliver measures 82.9% after the coverage pass

v0.3.63 -- 2026-09-01

v0.3.63 — 2026-09-01

  • docs: zero-entropy plan for notification grouping (N4)

v0.3.62 -- 2026-08-31

v0.3.62 — 2026-08-31

  • roadmap: demo.jaque.sh deployed, box checked
  • docs: zero-entropy plans for notification blocks N1-N3

v0.3.61 -- 2026-08-31

v0.3.61 — 2026-08-31

  • landing: jaque is the chess "check", not a translation of it

v0.3.60 -- 2026-08-30

v0.3.60 — 2026-08-30

  • docs: rfc draft

v0.3.59 -- 2026-08-30

v0.3.59 — 2026-08-30

  • ui: statusWordFor y statusText viven en status.ts
  • ui: los tiles de la overview cuentan hosts como up/down/unreachable
  • ui: los acks muestran la palabra de estado del kind, con color
  • api: HistoryEntry lleva kind, y el timeline traduce la palabra
  • ui: un host sin check propio se lee NO CHECK, no PENDING
  • ui: la columna Type del timeline se llama To type
  • docs: el vocabulario de estado por kind, en el doc normativo y en el del dashboard
  • docs: reflow del parrafo de la overview
  • demo: survive a host reboot, drop the edge container

v0.3.58 -- 2026-08-30

v0.3.58 — 2026-08-30

  • appconfig: -realms-config selects the aggregator flavour
  • aggregator: per-realm query clients and health fan-out
  • aggregator: golines formatting
  • cmd/jaque: -realms-config boots the aggregator flavour
  • docs: -realms-config flag row; roadmap: check A2
  • iter tests-coverage 1: Close changed-line coverage gaps in runAggregator/newRealmsHandler/run/NewClient
  • receipts: track A2 acceptance records
  • proto: realm qualification on status and object rows
  • aggregator: realm-qualified read fan-out with last-seen cache
  • aggregator: serve QueryService over the realm view
  • cmd/jaque: aggregator serves the aggregated QueryService
  • docs: realm fields on the query API; roadmap: check A3
  • iter tests-coverage 1: Add ListObjects coverage for query_handler and view
  • cmd/jaque: lint fixes on the aggregator handler and test
  • cmd/jaque: shorten nolint comment for golines
  • receipts: track A3 acceptance record
  • proto: realm on the forwardable command requests
  • aggregator: forward acks and downtimes to the owning realm
  • docs: realm routing on commands; roadmap: check A4
  • iter tests-coverage 1: Cover RemoveAcknowledgement, DeleteDowntime, ScheduleDowntime error path
  • receipts: track A4 acceptance record
  • web: realm dimension across the aggregator-facing views
  • web: realm-filter the host detail's service list
  • docs: the aggregator flavour page; roadmap: check A5
  • receipts: track A5 acceptance record

v0.3.57 -- 2026-08-29

v0.3.57 — 2026-08-29

  • adr: 026 UI aggregator flavour, realms over the native API
  • adr: accept 026 and add the UI aggregator roadmap block
  • realm: A1 inventory — Realm, Store seam, realms document loader
  • realm: drop unrequested doc.go outside A1's file list
  • realm: golines formatting on the A1 loader test
  • roadmap: check A1 realm inventory

v0.3.56 -- 2026-08-29

v0.3.56 — 2026-08-29

  • sink: deterministic exec test: exec cat, truncate between children

v0.3.55 -- 2026-08-29

v0.3.55 — 2026-08-29

  • demo: the vhost speaks the nginx the demo host runs

v0.3.54 -- 2026-08-29

v0.3.54 — 2026-08-29

  • demo: just deploy-demo ships the stack to the demo host
  • demo: one edge on the demo host, not two

v0.3.53 -- 2026-08-29

v0.3.53 — 2026-08-29

  • demo: the instance publishes its own config
  • prose-check: the forge owners are a banned term too

v0.3.52 -- 2026-08-29

v0.3.52 — 2026-08-29

  • demo: the demo.jaque.sh stack, config first
  • demo: jaque waits for a healthy ClickHouse
  • docs: the live demo page, and the landing points at it
  • roadmap: the demo stack landed; the box waits on a deploy

v0.3.51 -- 2026-08-29

v0.3.51 — 2026-08-29

  • ci: the runner stops spending a quarter of the check job zipping
  • ci: a chart-only change stops paying for the Go suite
  • ci: chart-check creates the bin directory it installs into

v0.3.50 -- 2026-08-29

v0.3.50 — 2026-08-29

  • chart: the engine StatefulSet honours revisionHistoryLimit

v0.3.49 -- 2026-08-29

v0.3.49 — 2026-08-29

  • ci: the chart waits for the image, and the image cross-compiles

v0.3.48 -- 2026-08-29

v0.3.48 — 2026-08-29

  • ADR-023: object kind in identity, with the kinds-and-states spec
  • K1: state.Kind in the identity (ADR-023)
  • roadmap: K2 also puts kind on the command surface's object reference
  • fix: ListProcesses/GetProcessTrace key process rows with NewProcessID
  • fmt: golines over K1's touched files
  • roadmap: K1 done
  • K2: kind on the external surface (ADR-023)
  • roadmap: K2 done
  • fmt: golines over the regenerated bindings
  • docs site: kind on targets and object rows (K2)
  • ui: kind-aware Hosts/Services/Overview views, per-kind status vocabulary, kind marks
  • ui: object-detail header uses statusWord, command targets carry kind
  • F: ascii-clean comments, dashboard docs for kind-aware views
  • roadmap: K3/F done
  • bp, state: typed Op constants, kind predicates replace raw comparisons
  • bp: negated kind comparisons use the predicate too
  • api: ObjectTarget is a oneof of host/service/process refs
  • ui: ack rows keep the snapshot kind, remove-ack targets a process correctly
  • claude.md: discriminated shapes are sums, never enum plus parallel fields
  • fmt: golines over the oneof rework
  • web: generate TypeScript from the protos alongside the Go bindings
  • ui: commands go through the generated Connect client
  • adr-025: the SPA's types are generated from the protos
  • check-ascii: the generated src/gen bindings mirror the proto comments, exempt
  • adr-025: drop the invented quote, the drift was caught pre-merge; ui-spa notes the reversal

v0.3.47 -- 2026-08-29

v0.3.47 — 2026-08-29

  • config: the loader takes schema sources as a list
  • config: the demo profile caps object counts and floors intervals
  • tests: the over-cap fixtures move into newTestXxxCUE helpers
  • tests: the demo fixtures live in testdata and count via comprehensions

v0.3.46 -- 2026-08-29

v0.3.46 — 2026-08-29

  • config: NewAuthConfig loads identities from their own CUE document
  • config: auth_schema.cue drops the golden-pinning tail copied from schema.cue
  • config: identities leave the monitoring document for -auth-config
  • docs: identities move to -auth-config, ADR-023 records the split
  • config, api: golines reflows the auth test files
  • receipts: coverage.accepted for the auth-config-split block

v0.3.45 -- 2026-08-28

v0.3.45 — 2026-08-28

  • config: profiles narrow the schema, demo refuses exec and filesystem surfaces
  • config: refresh a comment stale against NewConfig's profile signature
  • app: -config-profile selects the schema profile at boot and on apply
  • api: GetConfig returns the served CUE document
  • ui: the config editor validates and applies CUE with positioned diagnostics
  • docs: the config profile flag, GetConfig and the dashboard config editor
  • test: the routing snapshot normalizes hashed asset names, UI edits are not the contract
  • receipts: accept process-glue 0% coverage for the playground profile block

v0.3.44 -- 2026-08-28

v0.3.44 — 2026-08-28

  • config: CUE failures carry structured diagnostics as a typed error
  • receipts: accept main/runUI/cleanupTemp coverage for the config apply block
  • api: AdminService failures are connect errors carrying CUE diagnostics
  • api: a failing datasource query is unavailable, not internal
  • test: integration snapshots fix the API wire contract per service and role
  • docs: the API error model, codes and the config diagnostics detail
  • test: snapshots compact JSON bodies, protojson whitespace is not the contract

v0.3.43 -- 2026-08-28

v0.3.43 — 2026-08-28

  • receipts: accept main/runUI coverage for the read-only block
  • config apply API: ValidateConfig and ApplyConfig behind the admin role
  • fix: the root mux forwards AuthService, login reaches the API in the assembled binary
  • iter go-patterns 1: log the cancelled reload send, fix persistConfig's fallback comment
  • test: a persist failure during apply is rejected, audited and leaves no temp file

v0.3.42 -- 2026-08-27

v0.3.42 — 2026-08-27

  • read-only mode refuses every command surface behind one flag
  • fix: read-only config errors match fmt.Errorf convention, fold server-info test into query_service_test.go

v0.3.41 -- 2026-08-27

v0.3.41 — 2026-08-27

  • ui: -api-token loses its settings field, so the browser signs in or asks nothing

v0.3.40 -- 2026-08-27

v0.3.40 — 2026-08-27

  • auth: roles, credential hashes and stateless session tokens
  • iter tests-quality 1: Extract test fixture helpers in auth password/session/token tests
  • iter tests-quality 2: Extract shared testSecret fixture in auth session tests
  • auth: wrap the session token line the formatter wants wrapped
  • config: identities live in an optional auth block
  • plugins: the segfault fixture stops leaving its core in the repo
  • cmd: hash-password emits the hash the operator pastes into config
  • receipts: record why the auth config block ships before its docs
  • cmd: cover the hash-password dispatch predicate
  • chore: track the step-3 acceptances
  • test: the password hash fixture reports failures at its caller
  • api: one interceptor resolves the caller and enforces its role
  • chore: track the step-3 gate acceptances
  • style: run the repo formatter over the new api files
  • test: the handler auth cases collapse into one table
  • chore: track the step-4 gate acceptances
  • adr: native auth lives in config, sessions are stateless, roles sit at the RPC boundary
  • api: sessions log in over AuthService and the server signs the author
  • api: every login failure costs the same as a wrong password
  • api: the decoy hash moves into VerifyPassword and the test fixtures merge
  • cmd: wire the authenticator and refuse two auth models at once
  • chore: track the step-5 gate acceptances
  • cmd: auth options get a constructor and the open path gets a test
  • chore: track the step-6 gate acceptances
  • api: server info reports whether auth is configured
  • chore: track the step-7 gate acceptances
  • ui: the SPA logs in when the server says auth is configured
  • ui: auth fetches move to the lib module and a viewer sees no command
  • chore: track the step-8 gate acceptances
  • docs: auth is opt-in, and this is the block that turns it on
  • chore: track the step-9 gate acceptance
  • docs: the reference pages list the auth block and its flag
  • docs: the mutual-exclusion rule names the condition that triggers it
  • chore: track the final gate acceptance
  • chore: track the coverage acceptance for the rebased tip
  • receipts: track the acceptances that were only ever local

v0.3.39 -- 2026-08-27

v0.3.39 — 2026-08-27

  • ui: the timeline's picker opens at its natural width
  • test: the passive-result test waits for the engine's listener, not just its membership entry

v0.3.38 -- 2026-08-27

v0.3.38 — 2026-08-27

  • ui: the problems-only toggle goes away
  • ui: the nav keeps the operator loop flat and folds the rest into More
  • ui: search keeps the label, theme shrinks to an icon, sinks moves into settings
  • docs: the toolbar's two tiers

v0.3.37 -- 2026-08-27

v0.3.37 — 2026-08-27

  • ui: the palette module, one item per view, panel, object and action
  • ui: the command palette overlay, keyboard driven
  • ui: the palette opens on slash and ctrl-k, and runs what it finds
  • ui: palette styling, tokens only so both themes work
  • docs: the dashboard command palette
  • ui: the palette's active row survives the list shrinking under it
  • brand: the rook's cells fuse into one solid shape
  • bp: an evaluated tree expands nested process refs into their own trees
  • bp: gofmt the expand tests
  • api: the process trace expands nested processes into their trees
  • iter tests-quality 1: Split trace-expand subtest by tree level
  • ui: the trace layout descends into process refs that carry children
  • iter tests-quality 1: Extract shared newTestNestedRef helper
  • ui: trace navigation moves to open buttons and process diamonds collapse
  • docs: the trace shows nested processes inline and navigates via buttons
  • ui: the timeline filters by time window, resolved in a pure module
  • ui: the timeline's window comes from the same picker the panels use
  • ui: the range picker fits the timeline's control row
  • docs: the timeline's time window
  • ui: the timeline's picker reports an absolute window, so drop the dead range

v0.3.36 -- 2026-08-26

v0.3.36 — 2026-08-26

  • ui: ref kinds and drag offsets for the trace live in a pure module
  • ui: trace nodes drag freely and each kind draws its own shape
  • ui: a sub-threshold pointer wiggle no longer offsets the node
  • docs: the trace diagram explains its shapes and drag re-arrange
  • test: split the compound leaf-offset assertion in traceview.test.ts
  • bp: a program reports the refs of a named process
  • iter tests-quality 1: Merge duplicate RefsOf subtests into table-driven cases
  • engine: owned business processes evaluate at boot and on ownership gain
  • iter tests-quality 1: Split rebalance test, extracted membership/chained-program helpers
  • iter tests-quality 2: Remove dead Act call, merge overlapping rebalance subtests
  • docs: business processes evaluate at boot instead of waiting for a transition

v0.3.35 -- 2026-08-26

v0.3.35 — 2026-08-26

  • ui: timeline filtering, sorting and time formatting live in a pure module
  • ui: both timelines share a table with filters, a sort toggle and local times
  • docs: the dashboard timelines describe their filters and sort toggle

v0.3.34 -- 2026-08-26

v0.3.34 — 2026-08-26

  • ui: the time range picker sits at the right end of the panels row

v0.3.33 -- 2026-08-26

v0.3.33 — 2026-08-26

  • ui: scope flatpickr dark overrides to the dropdown, where inline mode actually renders
  • ui: quick-ranges scrollbar blends with the dropdown, grafana style
  • ui: dark tokens keyed to data-theme so a manual override can win
  • ui: manual light/dark theme switch, charts re-render on change
  • iter tests-quality 1: theme.test.ts: split round-trip test, default stubBrowserGlobals arg
  • docs: the console theme switch, dist regenerated

v0.3.32 -- 2026-08-26

v0.3.32 — 2026-08-26

  • ui: the process trace draws as a tree beside the table
  • ui: the collapse test splits per claim and the diagram sheds dead handlers

v0.3.31 -- 2026-08-26

v0.3.31 — 2026-08-26

  • bp: pure rule evaluator for business processes
  • iter tests-quality 1: Split multi-assert bp tests into subtests, extract program helpers
  • config: CUE-declared business processes compile to a bp.Program
  • config: format config_test.go
  • receipts: coverage acceptance for the bp sealed-union markers
  • bp: Program.Equal makes config comparable with go-cmp
  • bp: the sealed-union markers are exercised by the suite
  • Revert "bp: the sealed-union markers are exercised by the suite"
  • scripts: quality-pass exempts zero-statement functions from the coverage gate
  • engine: business processes evaluate on hard state changes
  • receipts: the step-3 acceptances for 439ac79
  • api: ListProcesses and GetProcessTrace expose business processes
  • ui+docs: business processes page and its documentation
  • receipts: the step-4 and step-5 acceptances

v0.3.30 -- 2026-08-26

v0.3.30 — 2026-08-26

  • webapp: ascii-only sources, gated by check-ascii like landing and docs

v0.3.29 -- 2026-08-26

v0.3.29 — 2026-08-26

  • ui: time presets carry display labels and a window formats as a label
  • iter tests-quality 1: Table-driven rangeLabel tests
  • ui: grafana-style time range picker with calendar and quick ranges

v0.3.28 -- 2026-08-26

v0.3.28 — 2026-08-26

  • datasource: red integration test for semantic query against real ClickHouse
  • iter tests-quality 1: DRY: extract newTestPerfdataConn and newTestSemanticRequest helpers
  • datasource: format the integration test
  • datasource: aliases must not shadow columns other aggregates read
  • ci: clickhouse integration job runs on schedule or by hand, never in the MR gate
  • coordination: watcher Close forgives a consumer already torn down

v0.3.27 -- 2026-08-26

v0.3.27 — 2026-08-26

  • roadmap: product horizons fix target, monetization posture and priorities

v0.3.26 -- 2026-08-25

v0.3.26 — 2026-08-25

  • gitignore: research/ holds local competitive-analysis mirrors

v0.3.25 -- 2026-08-25

v0.3.25 — 2026-08-25

  • roadmap: jaque migrate applies sink schemas out-of-band

v0.3.24 -- 2026-08-25

v0.3.24 — 2026-08-25

  • api: panel and object metric queries accept an absolute window
  • api: golines pass on the absolute window files
  • ui: time expressions resolve to an absolute window in the browser
  • ui: the panels range picker takes absolute and relative windows
  • ui: the picker inputs apply on change, not on every keystroke

v0.3.23 -- 2026-08-25

v0.3.23 — 2026-08-25

  • sink: clickhouse schema migrations with per-column codecs
  • sink: golines pass on the migration files
  • config: cluster field for the clickhouse sink, docs for schema migrations
  • internal/api: the query service test passes the sink spec's new cluster argument
  • sink: squash the clickhouse migrations to a single baseline

v0.3.22 -- 2026-08-25

v0.3.22 — 2026-08-25

  • query: a series carries the unit its values are in
  • test: ClickHouse.Close reports what the connection said
  • quality-pass: generated Go carries no coverage obligation
  • ui: the axes are painted in the theme's colors, not black
  • ui: the axis labels use the dim text color, not the faint one

v0.3.21 -- 2026-08-25

v0.3.21 — 2026-08-25

  • ui: panels view is legible, wide, and panels expand
  • ui: axisSize's empty-labels case is the floor, not a branch
  • ui: the object detail grid keeps the size it had
  • ui: the axis size hook survives uPlot's first, tickless call

v0.3.20 -- 2026-08-25

v0.3.20 — 2026-08-25

  • chart: Deployments keep one superseded ReplicaSet, not ten
  • scripts, gates: an untracked .accepted forgives nothing

v0.3.19 -- 2026-08-24

v0.3.19 — 2026-08-24

  • landing: the transcript wraps instead of scrolling sideways

v0.3.18 -- 2026-08-24

v0.3.18 — 2026-08-24

  • adr: chart rendering moves to a library
  • ui: uPlot enters the bundle with its pure data module
  • ui: charts render through uPlot, with hover, zoom and legend toggling
  • ui: the chart rebuilds when the series set changes
  • ui: one range selector drives every panel
  • ui: a panel that recovers on the next range stops showing its old error
  • ui: the panels range round-trips through the URL
  • ui: axis labels stay compact and long legends stop stretching cards

v0.3.17 -- 2026-08-24

v0.3.17 — 2026-08-24

  • docs, landing: the pipeline drawing says what actually happens

v0.3.16 -- 2026-08-24

v0.3.16 — 2026-08-24

  • landing: the three blocks that were content in an ASCII costume become markup

v0.3.15 -- 2026-08-24

v0.3.15 — 2026-08-24

  • landing: figures get a frame, and the pipeline drawing matches the docs

v0.3.14 -- 2026-08-24

v0.3.14 — 2026-08-24

  • docs: the nav rail folds on a wide screen too, and remembers it

v0.3.13 -- 2026-08-24

v0.3.13 — 2026-08-24

  • datasource: semantic SQL aliases stop shadowing the value column
  • ui: degenerate tick ranges collapse to a single tick

v0.3.12 -- 2026-08-24

v0.3.12 — 2026-08-24

  • config: datasources block, type-discriminated like sinks
  • config: ui block with datasource-backed panels
  • datasource: query contract and clickhouse implementation
  • datasource: prometheus implementation over query_range
  • proto: panel and object-metric query RPCs
  • api: panel query RPCs backed by a datasource registry
  • ui: panels view with native SVG charts
  • ui: automatic per-metric graphs on the object detail view
  • docs: ADR-018 datasources and native panels, site page, roadmap
  • docs: the nav rail folds on a phone, and its items stop outsizing their heading

v0.3.11 -- 2026-08-24

v0.3.11 — 2026-08-24

  • receipts: three coverage acceptances left uncommitted

v0.3.10 -- 2026-08-24

v0.3.10 — 2026-08-24

  • site: llms.txt, sitemap.xml and robots.txt move to the origin root

v0.3.9 -- 2026-08-24

v0.3.9 — 2026-08-24

  • docs: the language leaves the public surface too, exemption included

v0.3.8 -- 2026-08-24

v0.3.8 — 2026-08-24

  • docs: the brand doc records the typography that shipped, not the one it recommended

v0.3.7 -- 2026-08-24

v0.3.7 — 2026-08-24

  • docs: the last three ASCII diagrams get an SVG, and the gate stops being case-sensitive

v0.3.6 -- 2026-08-24

v0.3.6 — 2026-08-24

  • scripts: the public prose gate, because the instruction alone kept losing
  • docs: the headings lose the synthetic bold, the header gains the mark, the rail folds

v0.3.5 -- 2026-08-24

v0.3.5 — 2026-08-24

  • docs: the site drops the newspaper rules and picks up a docs type scale

v0.3.4 -- 2026-08-24

v0.3.4 — 2026-08-24

  • landing: the status line says the binary is handed over, not built from source
  • docs: the deployment diagrams carry their own styling again
  • docs: the reader gets a handed-over binary, not a repo to build from
  • docs: the chart is released alongside the binary, not shipped from a repository
  • docs: search runs in the browser off a build-time index, pagefind is gone
  • docs: the closed-source tree stops being cited as the docs' authority
  • docsgen: the search index carries each page's full text, not its first 200 characters
  • docs: the reference pages say transcribed, which is what they are, and the rewritten paragraphs rewrap
  • docs: the docs shell reads as the landing page's system, not Starlight leftovers
  • docs: the search box sits at its own width and the fonts load from where the build puts them
  • docs: the brand notes name the search index, pagefind is gone

v0.3.3 -- 2026-08-23

v0.3.3 — 2026-08-23

  • docs: the content contract and the navigation file docsgen reads
  • docsgen: the source model, shortcode parser and navigation loader
  • iter tests-quality 1: source_test.go: DRY helper, table-driven errors, stronger asserts
  • docsgen: links, anchors and the six checks over the sources
  • iter tests-quality 2: Group broken-fixture subtests under a parent t.Run
  • docsgen: HTML rendering from embedded templates, no hand-written markup in Go
  • docsgen: the published Markdown twin, llms.txt and the sitemap
  • iter tests-quality 3: publish_test.go header helper; sitemap_test.go split into subtests
  • docsgen: the builder, the output invariants and the docsgen command
  • docsgen: pages link the assets at the path the builder writes them to
  • iter tests-quality 1: build_test.go: testBuild struct + split subtest; verify_test.go: requireCorruptFile helper; render_test.go: exercise resolved-title branch
  • iter tests-coverage 1: close reachable coverage gaps in build.go/verify.go/render.go; remaining gaps are writer-seam or unreachable-given-upstream-validation
  • docsgen: the check recipe runs docs-check and build-site.sh builds the docs with Go
  • docsgen: walk errors are propagated and the deprecated Text call is gone
  • docs: the Starlight content becomes the docsgen content, Markdown as the source of truth
  • docs: the diagram fallbacks line up their boxes and ellipses
  • docs: Starlight and the Astro site are gone, docsgen is the only generator
  • scripts: the docs gates follow the pages to content/docs
  • docs: the sinks page keeps the ASCII-only rule the content gate now enforces

v0.3.2 -- 2026-08-23

v0.3.2 — 2026-08-23

  • sinks: metrics sinks belong to the sink role, events to the engine; -sink and -archive flags removed
  • chart+docs: the sink role selects CUE sinks; the deprecated flag surface is gone
  • docs: cli-flags and topologies stop naming the removed sink flags
  • test: positive -sinks narrowing and the skipped-sinks log asserted
  • sinks: the withEventCodec comment follows the role filter's contract
  • test: integration suites declare sinks in CUE, split per process role

v0.3.1 -- 2026-08-23

v0.3.1 — 2026-08-23

  • exec: red tests for SNMP typed perfdata (counter uom, label, no-threshold emission)
  • exec: SNMP runner emits every numeric value as typed perfdata; counters carry c from the wire type
  • config: label and uom fields on #SNMPCheck, wired to exec.SNMPEval
  • demo: homelab cpu/mem/net through SNMP (UCD-SNMP-MIB, IF-MIB)
  • grafana: CPU idle, memory available and network panels
  • docs: SNMP label/uom, wire-type counters (site, ADR-017 amendment)
  • exec: gofmt snmp_test.go
  • chart: worker, sink and notifier probes ask /healthz, the only health path those roles serve
  • test: skip corpus-scale CUE loads under -race
  • sink: the cursor behind a Cursor interface the file is one implementation of

v0.3.0 -- 2026-08-23

v0.3.0 — 2026-08-23

  • landing: the transcript stops claiming a release that was never cut
  • brand: paper and ink replace walnut and cream, and og-image gets a generator
  • iter tests-quality 1: Wrap OGImage dimension checks in a named subtest
  • pre-push-gate: the gates travel unguarded too, not just Go files
  • pre-push-gate: .gitlab-ci.yml is a gate too, and was still unguarded
  • docker: provenance attestations are unknown/unknown blobs GitLab refuses
  • landing: paper and ink, light first, and the rook goes still
  • site: the docs theme moves to paper and ink with a monochrome accent
  • site: the state comments name graphite, the ground they were relit for
  • docs: the design doc stops naming walnut, cream and amber
  • landing: the transcript's state words carry the page's only color
  • sink: exec close is check-then-act, two concurrent Close calls race on cmd.Wait
  • docs: the event log's transports are stated the way the code has them
  • docs: every countable claim now survives a reader with grep
  • sink: exec: bound Wait with WaitDelay so a surviving grandchild can't hang Close
  • docs: the quickstart can be completed on a stock Linux box
  • repo: the root files orient a stranger instead of misleading one
  • readme: it now sells the product and survives fact-checking
  • landing: every claim checks out and the page finally has a story
  • docs: the metrics page lists every series the recorder actually emits
  • docs: the architecture finally has a page a newcomer can start from
  • docs: every schema field, default and constraint in one reference page
  • docs: the security surface and the operator playbook stop being folklore
  • docs: the three contracts a plugin author needs are written down
  • site: last-updated, an ADR index, and a sidebar without collisions
  • docs: one home per topic, links that survive a base change, a calmer voice
  • landing: the incident replays itself and the page notices you scrolling
  • landing: the board assembles into the rook and the architecture draws itself
  • landing: the diagram's CRITICAL label gets a page-ground token the gate measures
  • landing+readme: the diagram label clears its line and the transcripts agree
  • docs: vendor the positioning brief the public surfaces are written from
  • roadmap: jaque.sh serves, and the docs-site block closes
  • landing: the page becomes the memo it always wanted to be
  • landing: the letterhead says what the product is, not what document it plays
  • docs site follows the landing into plaintext, and the replay finally ships
  • the copy stops kicking nagios on its way in, and the 404 joins the letterhead
  • docs: RFC register foundations, numbered sidebar, AsciiReplay, token guard
  • docs: RFC register foundations, numbered sidebar, AsciiReplay, token guard
  • docs: chapter 7 (deployment) rewritten in the RFC register
  • docs: chapters 3, 4 and 6 (checks, config, ingest) rewritten in the RFC register
  • docs: chapters 9 (nagios compatibility) and 11 (project) rewritten into the RFC register
  • docs: chapters 1 and 2 rewritten in the RFC register, with two replayed figures
  • docs-tokens: whole-file spans, .md->.mdx pairing, explicit moves map
  • docs: chapter 10 -- the reference register speaks RFC
  • docs-tokens: allow the stale Transition signature and the sysctl now in a fence
  • docs: chapters 5 and 8 (notifications, dashboard, observability) in the RFC register
  • state: a persisting hard problem emits NotifyProblem on every result; flap stop gates it by NotifyOnStop
  • docs: the site stops naming the technologies it embeds
  • config: notify_on_flap_stop flows from #Flap to FlapSettings
  • notify: property tests pin re-notification cadence and threshold escalation
  • receipts: docs-site.accepted for 6048630, docs land in the same branch
  • engine: test the live re-notification and escalation sequence through Loop.notify
  • tests: golines formatting for the re-notification tests
  • engine: log too-soon notification suppressions at Debug
  • docs: re-notification is verified; state model and roadmap say so
  • ui: port the landing token system into the status console
  • docs: the dashboard follows the system color scheme; roadmap records the SPA repaint
  • chart: chart-check gates lint, goldens, invalid cases and the generated README
  • chart: deploymentMode selects the shape, values carry one block per role
  • chart: every values key says what it does and which mode reads it
  • chart: split mode renders one workload per role with the flags each target accepts
  • chart: homelab values render production as a parity golden
  • chart: revisionHistoryLimit stays at the Kubernetes default
  • release: the chart carries the image tag through appVersion
  • docs: kubernetes page describes deploymentMode and what the chart refuses
  • docs: kubernetes page carries its Status line
  • docs: the install command names no registry host

v0.2.2 -- 2026-08-21

v0.2.2 — 2026-08-21

Fixes the two GitLab release jobs that had never actually run: docker now creates its buildx context with the TLS certs named explicitly instead of relying on inheritance, and chart clears alpine/helm's image entrypoint so its commands stop being wrapped in an extra shell. v0.2.1 ships with no image or chart; this tag is the first one that produces both.

v0.2.1 -- 2026-08-19

v0.2.1 — 2026-08-19

Passive check results can now arrive over the ConnectRPC API in batches, not just through the FIFO. Results for objects owned by another engine are forwarded automatically, and contrib/ingest ships a reference recipe for SNMP traps and logs.

v0.2.0 -- 2026-08-19

v0.2.0 — 2026-08-19

Clustering continues (ADR-015 block 3c): a UI process started with -target ui now forwards commands to the whole engine fleet over jaque.work.cmd.ingress, so acknowledging or scheduling downtimes from the dashboard works regardless of which engine owns the object.

v0.1.0 -- 2026-08-19

v0.1.0 — 2026-08-19

Clustering continues (ADR-015 block 4a): perfdata sinks now run only on the engine that owns an object, avoiding duplicate writes, and can run as their own process with -target sink.

v0.0.13 -- 2026-08-19

v0.0.13 — 2026-08-19

Perfdata sinks gained a log archive sink and a remote_write sink (ADR-016), both usable together via multi-sink fan-out, plus a ready-made Grafana dashboard pack. Separately, the release pipeline now reads PR labels to pick the version bump and fails loudly instead of silently defaulting to a patch release.

v0.0.12 -- 2026-08-19

v0.0.12 — 2026-08-19

Clustering continues (ADR-015 block 3b): commands issued for an object are now forwarded to the engine that owns it over jaque.cmd.<engine-id>, so it no longer matters which engine received the request. A new jaque_objects gauge metric reports object counts per engine.

v0.0.11 -- 2026-08-19

v0.0.11 — 2026-08-19

Clustering continues (ADR-015 block 3): a coordination layer adds a KV store with TTLs, cluster membership tracking, and rendezvous hashing to decide which engine owns which object. Mostly internal plumbing that the rest of the cluster work builds on.

v0.0.10 -- 2026-08-18

v0.0.10 — 2026-08-18

Internal refactor release; no user-visible changes.

v0.0.9 -- 2026-08-18

v0.0.9 — 2026-08-18

Clustering continues (ADR-015 block 2): engines follow object ownership through a follower loop, and the dashboard can now run standalone as its own process with -target ui.

v0.0.8 -- 2026-08-18

v0.0.8 — 2026-08-18

First step of clustering (ADR-015 block 1): a work queue and remote runner let a binary run as a dedicated engine or worker via the new -target engine|worker flag, instead of always doing everything in one process.

v0.0.7 -- 2026-08-18

v0.0.7 — 2026-08-18

Notifications can now be delivered to Telegram.

v0.0.6 -- 2026-08-18

v0.0.6 — 2026-08-18

Downtimes can now be created directly from the Downtimes view in the dashboard, without going through the API or config.

v0.0.5 -- 2026-08-18

v0.0.5 — 2026-08-18

Documentation-only release; no runtime changes. ADR-015 was published, laying out the cluster topology design: engine roles, a pull-based work queue, and per-object ownership.

v0.0.4 -- 2026-08-17

v0.0.4 — 2026-08-17

The dashboard now shows the running jaque version alongside the project logo and favicon.

v0.0.3 -- 2026-08-17

v0.0.3 — 2026-08-17

The dashboard now opens on an overview landing page. You can also select multiple objects and apply bulk actions to them, and a new Downtimes view lists active and scheduled downtimes.

v0.0.2 -- 2026-08-12

v0.0.2 — 2026-08-12

The dashboard gained a host/service drilldown view, and labels shown in the UI are now clickable to filter the object list by them.

v0.0.1 -- 2026-08-12

v0.0.1 — 2026-08-12

Internal build fix release; no user-visible changes. The Docker web build stage now copies pnpm-workspace.yaml, fixing a broken container image build.