6.1 KiB
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/killendpoints
Added — mosh/ssh shell attach (E10)
- MoshManager with command builder (mosh-via-SSH-bootstrap)
/api/nodes/{name}/shellGET + 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/targetsreads frombackend/targets/catalog.py(6 systems: Gentoo, Buildroot, OpenWrt, ALFS, SourceMage, Lunar)/api/targets/arches+/api/targets/runtimesendpoints
Added — Health + metrics
/api/healthendpoint (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 --watchflag onbuildcommand (streams events via WebSocket)
Fixed — Critical backend bugs
api/api.pyorder bug (bus.subscribe()beforebus = EventBus())- 7 broken
_endpointsymbol imports cause_graph.attach_bus+emit_debugdefined at module scope (zero indentation)- Three missing files:
timeline_store.py,failure_autopsy.py,failure_propagation.py - Two Python module/package name collisions (
scheduler.pyvsscheduler/,nodes.pyvsnodes/,cache.pyvscache/) execute_actionpassing empty{}as cwd →TypeError- Build env never reaching subprocess
- Debugger/pipeline-control
_ENGINEalwaysNone failure_propagationlooking forevent.data.deps(legacy shape)- Autopsy session ID mismatch
/api/releasewas a pure stub/api/policy/setdidn't persist/ws-debuggerreturned canned data, ignored commandsforgejo.on_push_eventwrong PipelineEngine aritypipeline/feedback.pyPolicyEngine() with no args
Fixed — Standardization
- ~20 bare imports converted to
backend.*prefix - Two parallel event taxonomies unified (
types.pyre-exports fromschema.py) MinioCache.__init__made lazy (was crashing on import if MinIO unreachable)cache.pygraceful fallback for non-writable pathsroles_store.pygraceful fallback for non-writable/etc/fester/FesterEventmadenode/action/statetruly optional (hadOptional[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 exposeFesterTargetsglobal
Fixed
live_dag.htmlwas broken (referenced undefinedFesterTargets)style.csswas 0 bytesindex.htmlwas a 30-line throwaway
[0.1.0] — Initial commit
Added
- Basic project structure
- Backend modules (many stubbed)
- Cockpit module
- Install scripts
- CHEATSHEET.md