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.