fester/CHANGELOG.md

6.1 KiB

Changelog

All notable changes to Fester are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Added

  • Documentation: README.md, quickstart.md, CONTRIBUTING.md, CHANGELOG.md
  • Tooling: bootstrap.sh, run.sh, pyproject.toml, .gitignore
  • Docker support (Dockerfile)
  • Screenshots for all 8 UI pages

[0.3.0] — 2026-06-28

Added — Storage layer

  • SQLite-backed persistence for builds, sessions, events, and node states
  • Btrfs CoW reflink snapshots (backend/storage/btrfs_cas.py)
  • QCOW2 workspace freezing with real mount + rsync (backend/storage/qcow2_freeze.py)
  • tmpfs workspace acceleration
  • Storage status + config + freeze + reflink + snapshots endpoints

Added — tmux integration (E9)

  • TmuxManager with session create/list/inspect/capture-output/kill
  • runtime: "tmux" action runtime — runs actions in detached tmux sessions
  • Live output viewer in Sessions page UI
  • /api/actions/active, /api/actions/{name}/tmux/output, /tmux/kill endpoints

Added — mosh/ssh shell attach (E10)

  • MoshManager with command builder (mosh-via-SSH-bootstrap)
  • /api/nodes/{name}/shell GET + POST endpoints
  • "⌘ Shell" button on Dashboard node rows (copies command to clipboard)

Added — Real engine wiring

  • BuildRunner wraps PipelineEngine with build lifecycle + persistence
  • Real DAG execution with proper cwd + env passing
  • Failure propagation: skipped actions on failed deps
  • Critical path computation + tagging in events
  • Debugger pause/resume/step actually controls running engines

Added — Cause graph + blast radius

  • /api/propagation/{action} — forward blast radius computation
  • /api/cause/explain/{node} — causal chain for a node
  • Blast Radius panel in Cause Graph UI page
  • Failure autopsy with proper session ID correlation

Added — Storage + target catalog

  • /api/targets reads from backend/targets/catalog.py (6 systems: Gentoo, Buildroot, OpenWrt, ALFS, SourceMage, Lunar)
  • /api/targets/arches + /api/targets/runtimes endpoints

Added — Health + metrics

  • /api/health endpoint (version, bus_subscribers, ws_clients, builds_known, timeline_events)
  • Live health indicator in topbar (all pages)
  • Prometheus metrics aligned with grafana config names (fester_node_cpu, fester_pipeline_actions_total, etc.)
  • Pipeline action counters + cache hit counters wired via bus subscriber

Added — UI enhancements

  • New Timeline page (per-node event drill-down)
  • Node policy dropdowns (preferred/avoid/neutral) on Dashboard
  • Per-node "Probe" buttons + "Probe All" button
  • Build cancel + replay buttons on Sessions page
  • Event filter chips on Dashboard (toggle by event type)

Added — CLI overhaul

  • 35+ subcommands (was 11)
  • Nested subcommands: node {list,set-policy,probe,probe-all}, cause {explain,trace,events}, replay {start,step,reset}, debugger {state,pause,resume,step}
  • New: build, builds, build-info, cancel, release, targets, toggle-target, blast, timeline, rewind, autopsy, policy-list, health
  • --watch flag on build command (streams events via WebSocket)

Fixed — Critical backend bugs

  • api/api.py order bug (bus.subscribe() before bus = EventBus())
  • 7 broken _endpoint symbol imports
  • cause_graph.attach_bus + emit_debug defined at module scope (zero indentation)
  • Three missing files: timeline_store.py, failure_autopsy.py, failure_propagation.py
  • Two Python module/package name collisions (scheduler.py vs scheduler/, nodes.py vs nodes/, cache.py vs cache/)
  • execute_action passing empty {} as cwd → TypeError
  • Build env never reaching subprocess
  • Debugger/pipeline-control _ENGINE always None
  • failure_propagation looking for event.data.deps (legacy shape)
  • Autopsy session ID mismatch
  • /api/release was a pure stub
  • /api/policy/set didn't persist
  • /ws-debugger returned canned data, ignored commands
  • forgejo.on_push_event wrong PipelineEngine arity
  • pipeline/feedback.py PolicyEngine() with no args

Fixed — Standardization

  • ~20 bare imports converted to backend.* prefix
  • Two parallel event taxonomies unified (types.py re-exports from schema.py)
  • MinioCache.__init__ made lazy (was crashing on import if MinIO unreachable)
  • cache.py graceful fallback for non-writable paths
  • roles_store.py graceful fallback for non-writable /etc/fester/
  • FesterEvent made node/action/state truly optional (had Optional[str] type but no default)

[0.2.0] — 2026-06-27

Added — Real FastAPI backend

  • backend/main.py — FastAPI app with 50+ routes
  • All routers wired: replay, autopsy, timeline, debugger, pipeline_control, nodes, metrics, cause
  • WebSocket hub with /ws, /ws-targets, /ws-debugger
  • Ambient loop for node probing + drift
  • SQLite storage layer (backend/storage/sqlite_db.py)
  • Node probe module (backend/nodes/probe.py)
  • BuildRunner (backend/pipeline/runner.py)

Added — UI overhaul (7 pages)

  • Dashboard (index.html) — 3-column layout with cluster stats, live stream, quick actions
  • Live DAG (ui/live_dag.html) — layered Sugiyama-lite layout, SVG edges, click-to-inspect
  • Replay (ui/replay.html) — timeline scrubber, play/pause/step, structured inspector
  • Sessions (ui/sessions.html) — build history + replay links
  • Metrics (ui/metrics.html) — live charts + per-node cards
  • Cause Graph (ui/cause.html) — radial graph visualization
  • Debugger (ui/debugger.html) — step-through execution control

Added — Shared infrastructure

  • style.css — full design system (dark theme tokens, panels, badges, buttons, scrollbars)
  • ui/app.js — shared shell (WS auto-reconnect, FesterTargets global, toasts, topbar nav)
  • cockpit/fester-module/targets.js — fixed to expose FesterTargets global

Fixed

  • live_dag.html was broken (referenced undefined FesterTargets)
  • style.css was 0 bytes
  • index.html was a 30-line throwaway

[0.1.0] — Initial commit

Added

  • Basic project structure
  • Backend modules (many stubbed)
  • Cockpit module
  • Install scripts
  • CHEATSHEET.md