135 lines
6.1 KiB
Markdown
135 lines
6.1 KiB
Markdown
# 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
|