# Changelog All notable changes to Fester are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [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