Skip to content

Changelog

  • Demo video — 25s silent promo embedded on the landing page (/#demo): real example output, real report screenshots, install command. Composition committed under website/video/.
  • Live Dashboard guide — routes, configuration, CORS, and reconnection replay for the live/ sub-package.
  • README trust sections — “Who is this for?” and “When NOT to use this”.
  • GOEXPERIMENT=jsonv2 documented for consumers — downstream builds fail without the flag; the error text and fix are now in the Installation guide.
  • Docs retrofit — lastUpdated + “Edit this page” on every page, curated “Where to go next” sections, OG image, sibling libraries in Related Tools.
  • Changelog page was two releases stale (stopped at v0.8.0); now includes v0.9.0 and v0.10.0.
  • API reference: added RunID, SetOnEvent, Enable, Write*String, StreamEvents, MultiWriter; Config fields completed; sample schema version corrected to 0.3.0.
  • Contributing page coverage gate corrected to 94% (was 95%).
  • Landing demo terminal now matches real example output.
  • Plugin.RecordCommand / Recorder.RecordCommand: integrations that wrap command execution (e.g. cmdguard’s middleware) can now record command-level audit events — PhaseBefore at start, PhaseAfter with wall-clock duration and error at completion. New EventTypeCommand ("command", label “Command”) and Event.IsCommand(). Commands are not DI services: no service record is created and they never appear in Report.Services — they surface in Report.Events / the NDJSON event stream only, with the command name in ServiceRef.ServiceName. Unblocks cmdguard’s “command-level audit middleware” (cmdguard TODO F1).

Changed — Strict enum validation on load

Section titled “Changed — Strict enum validation on load”
  • Corrupt event streams now fail loudly: ReadEvents additionally rejects unknown provider_type values (previously only event_type/phase were checked), and ReplayEvents now validates all three enum fields per event — an unknown value previously caused applyEvent to silently drop the event, producing a lossy “successful” replay. Empty provider_type remains valid (“undetermined”). All three sentinels (unknown event_type, unknown phase, unknown provider_type) are classified as errorfamily.Corruption. Design note: validate-at-load was chosen over strict UnmarshalJSON on the enum types to preserve forward compatibility (older binaries can still parse newer streams) — see TODO plan T33.
  • Report.Diff now compares dependency edges: ServiceDiff gained AddedDeps / RemovedDeps ([]ServiceRef, JSON added_deps / removed_deps, omitted when empty). Rewiring an existing service’s dependencies is now reported as a per-service change instead of being silently ignored — closing the gap the June 2026 status report flagged and the (then-untruthful) doc comment claimed. Both lists use the canonical ServiceRef ordering.
  • Demo video: 25s silent promo (real example output, real report screenshots) rendered with HyperFrames, embedded above the fold at do-auditlog.lars.software/#demo with poster, og:image, VideoObject JSON-LD, and long-cache headers. Composition committed under website/video/.
  • Live Dashboard guide (guides/live-dashboard.mdx): the live/ sub-package finally has docs — routes, config, CORS, reconnection replay.
  • README trust sections: “Who is this for?” (5 personas) and “When NOT to use this” (with alternatives).
  • GOEXPERIMENT=jsonv2 documented for consumers: a downstream build fails without the flag (verified empirically); README and the website Installation page now say so with the exact error text.
  • Docs retrofit: Starlight lastUpdated + editLink enabled; curated “Where to go next” on every docs page; OG image (1200x630); Related Tools gained the sibling libraries (go-health, go-workflow-auditlog, go-sse, go-ndjson).
  • Changelog page synced: the docs changelog stopped at v0.8.0 (live site even at v0.6.0); now includes v0.9.0 and v0.10.0.
  • API reference updated: Config.RunID/MaxEvents/InitialEventCapacity, SetOnEvent, Enable, DroppedEventCount, Write*String methods, StreamEvents, MultiWriter, live package section; sample JSON schema version corrected to 0.3.0.
  • Coverage gate number: website Contributing page said 95%; the actual CI gate is 94%.
  • Landing demo terminal: numbers now match real example output (Services 20, Events ~145, Scopes 4); removed fabricated “45.2ms” build time.
  • Env-var semantics corrected: installation docs claimed DO_AUDITLOG_ENABLED overrides Config.Enabled; the env var is only consulted when Config.Enabled is the zero value.

Fixed — CI & Toolchain (2026-09-01 repair sessions)

Section titled “Fixed — CI & Toolchain (2026-09-01 repair sessions)”
  • Master CI restored to green after 33 days red: ci.yml go-version aligned with go.mod (1.26.7) in all jobs — a 2026-08-29 go.mod bump without the matching CI bump failed every Go job with GOTOOLCHAIN=local on runners. goreleaser pinned to v2.17.1 (v2.18.0+ requires Go ≥ 1.27).
  • Coverage gate made enforceable again: the CI grep now excludes generated *_templ.go (matching scripts/coverage-gate.sh); without it the gate read 87% and failed since Aug 14 while later failures masked it. Gate now passes at 95.2%.
  • go-sse/ssetest promoted from // indirect to direct requirement in go.mod (directly imported by tests since the ssetest migration, but the go mod tidy drift was pending).
  • Website workflow can now run: setup-node SHA typo fixed (every run died at action resolution in ~6s since ~Aug 14), cache path corrected to pnpm-lock.yaml, and pnpm/action-setup (v4.1.0, SHA-pinned) added to both jobs — runners do not ship pnpm, and the workflow’s first real execution (2026-09-01) died on exactly that. pnpm install now runs --frozen-lockfile to catch manifest/lockfile drift.
  • flake.nix GOTOOLCHAIN pinned to go1.26.7 (devShell + coverage + auditlog apps) in lockstep with go.mod.
  • Docs synced to the above: AGENTS.md toolchain-pin section (bump-in-same-commit rule), CONTRIBUTING.md, coverage-gate exclusion list, CSP claim (default-src 'none' is present), status reports.

Fixed — Website Deploy Pipeline (2026-09-02/04)

Section titled “Fixed — Website Deploy Pipeline (2026-09-02/04)”
  • Website workflow actually deploys: the deploy job’s second setup-node SHA was corrupted (unresolvable action), firebase-tools action-install was unreliable (switched to npm install, pinned 15.28.2), the changelog guard ran from the wrong working directory, and corepack enablement had to precede setup-node. First fully green install → check → build → validate → deploy runs followed.
  • HTML cache rule matches cleanUrls pages (Firebase rewritten-path lookups were bypassing the cache headers).
  • TypeScript pinned back to ^6.0.3: an automated dependency bump moved specifiers (TS ^7.0.2/tsgo) without regenerating pnpm-lock.yaml, breaking astro check (assertCompatibleTypeScript) and the frozen-lockfile install; lockfile regenerated (also pulls fast-uri 3.1.7, closing four Dependabot advisories).
  • Drift guards survive the .golangci.yml reformat (check-go-version.sh no longer depends on single-line formatting).
  • SSE subscribe race closed (live/server.go): a new SSE client’s subscription was registered after the initial snapshot was rendered, so an event emitted in between existed in neither the snapshot nor the live stream — silently lost. Subscribe now happens before replay/snapshot: replay covers the past, the snapshot covers current state, everything after Subscribe arrives live.
  • Live legend ordering uses ProviderType constants instead of repeated string literals (removes a goconst/version-skew landmine).
  • Dashboard ships with a working CSP again: the embedded Datastar v1.0.2 runtime compiles every data-* expression with the Function() constructor, requiring script-src 'unsafe-eval' — the dashboard’s CSP meta only allowed 'unsafe-inline', so the dashboard rendered nothing but EvalErrors out of the box. CSP now includes 'unsafe-eval' (documented tradeoff), and frame-ancestors 'none' — ignored inside <meta> per spec — is delivered as an HTTP response header by the live server instead. Static report meta cleaned of the dead directive (base-uri 'none' kept). New regression test TestServer_DashboardCSP; golden fixture regenerated.
  • CI Lint job un-broken: .golangci.yml used the schema-invalid key min-length (correct: min-len), which made golangci-lint config verify exit 3 on every golangci-lint version — killing the Lint job before lint run even started. Also: six inline errors.New in example/services.go converted to package-level sentinels (CI-blocking err113) and FuzzFilterInputs refactored below the gocognit threshold (behavior identical).

A minor release for integrations that must create the plugin before they know their runtime configuration. Non-breaking.

  • Plugin.SetOnEvent(fn) — sets or replaces the OnEvent callback after New(). Race-safe with recording goroutines; replaces (does not chain) any Config.OnEvent callback — compose with MultiWriter beforehand if several sinks must all keep receiving events.
  • Plugin.Enable() — turns audit logging on after construction, regardless of Config.Enabled or DO_AUDITLOG_ENABLED. Idempotent.
  • Dependency upgrades: go-sse v0.5.0, go-atomic-write v0.5.0.

A minor release introducing RunID for cross-system event correlation, MultiWriter for event fan-out, StreamEvents for callback-based NDJSON replay, SSE reconnection replay with a ring buffer, Write*String convenience methods, time-based flush for NDJSONStreamer, and full keyboard navigation across both dashboards. The health/ sub-package was extracted to its own project, go-health.

Breaking: NewRecorder and NewReport signatures gained a RunID parameter. Report schema version bumped from 0.2.0 to 0.3.0 (old reports are auto-upgraded via MigrateReport).

  • RunID branded type — 128-bit hex correlation ID, auto-generated via crypto/rand and stamped on every Event and the Report. Override via Config.RunID.
  • MultiWriter — event fan-out to multiple OnEvent callbacks simultaneously (streaming + live dashboard + custom handlers from a single recorder). Thread-safe, preserves callback order.
  • StreamEvents — callback-based NDJSON reader for replaying event files without full materialization.
  • WithFlushInterval — time-based flush option on NDJSONStreamer for bounded-latency flushing.
  • Write*String methods — WriteMermaidString, WritePlantUMLString, WriteDOTString, WriteD2String, WriteHTMLString, WriteTreeString, WriteHTMLTreeString, WriteTableString return output as a string — no io.Writer needed.
  • SSE ring-buffer replay (live/) — reconnecting clients with a Last-Event-ID header receive missed events via the configurable ReplayBufferSize.
  • Full keyboard navigation in both dashboards — skip link, ARIA tablist, ? shortcuts dialog with focus trap, / focus search, sortable column headers with aria-sort.
  • Timing deltas in DiffResult — TotalBuildDurationMsDelta and TotalShutdownDurationMsDelta.
  • Exported testhelpers/ — write integration tests against the audit-log types from downstream modules.
  • Goreleaser + RELEASE.md — release automation for the auditlog CLI binary (linux/darwin amd64/arm64).

A minor release: ALPHA→BETA status promotion, exported sentinel errors, and dependency upgrades (go-atomic-write v0.4.0, go-error-family v0.10.0, go-output v0.32.0, go-sse v0.2.1). Go 1.26.5 is now the required minimum. Non-breaking.

  • Project status: ALPHA → BETA. The README.md and STABILITY.md pre-1.0 notices have been updated accordingly.
  • Exported sentinel errors — 11 previously-unexported sentinels (e.g. errContainerIDPathSep → ErrContainerIDPathSep) are now exported so consumers can match them with errors.Is.
  • Adopted the new go-atomic-write API — WriteFunc(path, fn, Fingerprint{}) migrated to the plain WriteFunc(path, fn) variant.
  • Go 1.26.5 required minimum across go.mod, the Nix devShell, CI, and docs.
  • DiffResult.HasChanges() — polarity reconciliation with the go-workflow-auditlog twin.

A patch release: Go version regression. Non-breaking.

  • Go 1.26.5 → 1.26.4 in go.mod, aligning with the documented Nix devShell pin and docs. (Re-bumped to 1.26.5 in v0.8.0 — see above.)

A feature release: real-time SSE live dashboard, cross-project feature ports (error classification, atomic writes, NDJSON streaming, diagram direction, table column selection), typed identifiers, ServiceInfo domain split, and go-output v0.31.1. Includes breaking changes for typed identifiers and the ServiceInfo split.

  • Real-time live dashboard (live/ sub-package): SSE streaming HTTP server with an interactive warm-amber HTML dashboard. Six endpoints with configurable route prefix. 35 tests.
  • Cross-project feature ports from go-workflow-auditlog: go-error-family classification, go-atomic-write crash-safe writes, NDJSON streaming, diagram direction option, table column selection.
  • Typed identifiers + ServiceInfo domain split (ContainerID/ScopeID/ServiceName named string types; ServiceInfo split into ServiceIdentity/ServiceLifecycle/ServiceHealth/ServiceGraph embedded structs). Breaking for composite literals.
  • GitHub Actions SHA pinning in ci.yml.

A feature release: public documentation website, Nix flake modernization, and comprehensive docs-accuracy audit. Non-breaking.

  • Public documentation website: full Astro v7 + Starlight + Tailwind v4 site deployed at do-auditlog.lars.software with 11 docs pages, landing page, Firebase hosting, and CI deploy workflow.
  • Newsletter subscription component on the project website.
  • Nix flake modernization: migrated from flake-utils/eachDefaultSystem to flake-parts with treefmt-nix for standardized formatting checks.
  • Nix build check: added build output as a check in the treefmt configuration.
  • Dependency updates: golang.org/x/sync v0.21.0 to v0.22.0, golang.org/x/sys v0.46.0 to v0.47.0, golang.org/x/term v0.44.0 to v0.45.0, nixpkgs bumped to latest.
  • TODO_LIST.md cleanup: all 127 completed items removed — they are comprehensively documented in this CHANGELOG. The file now contains only the 2 genuinely deferred items and 5 explicitly rejected proposals.
  • Docs-accuracy audit: corrected linter count (108 to 109), GraphStyle to NodeStyle (renamed in go-output v0.30.0), Go version (1.26.3 to 1.26.4 in go.mod), coverage gate threshold (95% to 94% in 4 locations to match actual CI config), MigrateReport description, RenderTableData to RenderTable, stale test/parallelism counts, release versioning pattern (v0.0.x to v0.x.y).
  • BuildFlow go-auto-upgrade revert: reverted a catastrophic automated migration to encoding/json/v2 + encoding/json/jsontext (build-constraint-excluded in Go 1.26.4) that left the project uncompilable. Documented the incident and the encoding/json/v2 exclusion policy in AGENTS.md.
  • godoclint false positive: godoclint reported “package has more than one godoc” because it counted the // templ: version: header in generated html_templ.go as a second package doc. Added a text-based exclusion rule in .golangci.yml.
  • Stale HTML golden file: testdata/golden/report.html was from a pre-formatting-normalization commit, causing TestReport_WriteHTML_GoldenFile to fail. Regenerated via UPDATE_GOLDEN=1.
  • govulncheck CI: replaced golang/govulncheck-action@v1 with direct go run golang.org/x/vuln/cmd/govulncheck@latest to avoid action version drift.

A patch release: go-output hotfix bump. Non-breaking.

  • go-output v0.30.0 to v0.30.1: picked up upstream patch fixes across all go-output modules.

A maintenance release: go-output v0.30.0 API adoption. Non-breaking.

  • go-output v0.23.x to v0.30.0: adopted the go-output v0.30.0 API across diagram and table rendering code.
    • d2.NewD2Diagram() to d2.NewDiagram().
    • output.GraphStyle to output.NodeStyle (diagram theming).
    • output.TableData to output.Table, output.RenderTableData() to output.RenderTable().

A maintenance release: daghtml SDK adoption, hook refactoring, and dependency upgrades. Non-breaking.

  • daghtml SDK adoption: replaced 306 lines of inline Sugiyama DAG JavaScript in html.templ with the go-output/daghtml SDK.
  • Hook refactoring: centralized per-hook preamble logic into hookContext helpers in hooks.go.
  • CSS token extraction: extracted inline CSS color values into named constants for maintainability.
  • Test infrastructure: centralized test fixtures and extracted shared helpers into helpers_test.go.
  • Go 1.26.4: bumped Go version and updated tooling dependencies.

A feature release: tree and table export formats, plus CLI coverage. Non-breaking.

  • Tree export: dependency DAG rendered as ASCII tree or HTML nested-list tree.
  • Table export: service summary table in 16+ formats (table, json, csv, tsv, markdown, xml, d2, yaml, html, tree, mermaid, dot, jsonl, asciidoc, toml, plantuml).
  • CLI convert subcommand extensions: tree, htmltree, and table output formats.

A feature release: D2 diagram export, go-output adoption, and Plugin API parity. Non-breaking.

  • D2 diagram export via go-output/d2.
  • Plugin-level diagram wrappers: all 9 export formats now have both Write and Export methods.
  • Diagram rendering adopted go-output: replaced the hand-rolled diagramFormatter interface with validated go-output renderers.

A milestone release: CLI tool, replay engine, NDJSON import/export, JSON Schema, CSV/TSV/DOT export.

  • Replay engine (ReplayEvents): reconstructs a Report from a flat event stream.
  • NDJSON reader (ReadEvents): line-delimited JSON events with 1 MB max-line guard.
  • Loader API (LoadReport): auto-detects JSON vs NDJSON.
  • CSV/TSV export: service data as delimited values.
  • DOT diagram export: Graphviz digraph.
  • JSON Schema: Draft 2020-12 schema generated from Go types.
  • CLI tool (cmd/auditlog): info, convert, diff, validate, schema subcommands.
  • NewReport constructor: builds a validated Report from core data.
  • Real-time event streaming via Config.OnEvent callback.
  • Removed LoadReportFromJSON (use MigrateReport).
  • Removed LoadReportFromNDJSON (use LoadReportFromReader with FormatNDJSON).
  • MigrateReport scope counting: migration now reuses countScopeNodes.
  • Filtered reports: functional options to slice by name, type, scope, event type, time range.
  • PlantUML export: component diagram format.
  • Mermaid export: flowchart format for GitHub/GitLab/Notion.
  • Health check recording: RecordHealthCheck wrapper.
  • Config.OnEvent callback.
  • Initial release.
  • Plugin with hooks for registration, invocation, shutdown.
  • JSON and NDJSON export.
  • HTML visualization with warm amber dark theme.
  • Dependency graph inference via invocation stack.
  • Scope tree tracking.
  • Service type detection (lazy, eager, transient, alias).