Repository navigation
🚀 What's Changed
Across the platform
- Removed Adaptive training mode; removed the "linear" terminology as the only mode is now linear
- Added a clear button to all relevant inputs, with unified behaviour throughout
- Capped titles and names at 256 characters, and token prefixes at 32
- Long text truncated in tables and cards reveals itself on hover, and only when actually clipped
- Multi-line fields grow to fit their content instead of being dragged to resize
- Unsaved changes state now persists on save failures
- Removed all D3-based visualizations and replaced them with ECharts visualizations
New charts
- All charts poll live data and offer CSV export
- Progress - per-trainee progress across levels over time
- Added a duration mode aligning every run to zero and showing elapsed time only
- Added an event type filter
- Status tiles - run state, time remaining, hints used and score
- Feedback overview - one trainee's identity and how their run concluded
- Live event feed - aggregated feed of most recent events
- Scoreboard - trainees ranked by score and duration
- Players per level - number of active runs at each level
- Score attainment - distribution of trainees across score bands
- Level difficulty - per-level difficulty from wrong answers, hints, solutions and time
- Top wrong answers - most frequent incorrect answers per level
- Trainee wrong answers - one trainee's incorrect answers
- Time vs expected - time spent per level against the authored estimate
- Time vs score - time spent against points scored per level
- Cumulative score - score accumulating level by level
- Overall speed vs score - every run's total time against its score
- Level percentiles - a run's score and time ranked against others, per level
- Assists coverage - which hints and solutions a run opened
- Event timeline - chronological run events with commands plotted beneath
- Commands - console commands aggregated per level, searchable, with argument folding
- Command log - one run's commands in order, with host, source IP and working directory
Training analysis dashboard
- Replaced all instance organiser visualizations with a dedicated analysis dashboard
- Aggregated view
- Presents the instance as a whole, covering current trainee standing and providing basis for improving the training definition
- Contains status tiles, progress, live event feed, scoreboard, players per level, score attainment, level difficulty, top wrong answers, time vs expected and commands
- Trainee view
- Presents a single selected run end to end, for monitoring or debriefing an individual trainee
- Contains cumulative score, time vs score, trainee wrong answers, event timeline and command log
- Runs are picked from a list carrying score, time, current level, hints, solutions and wrong answers
- Assessment view
- Presents the distribution of answers per question, allowing for question quality and difficulty analysis
- Selecting an answer highlights every trainee who chose it
- CSV export of the shown assessment, one row per trainee and question
- Aggregated view
- Selected view and trainee are held in the URL fragment, for sharing and bookmarking
- Removed now deprecated views: dashboard, quiz results, walkthrough, command timeline and command analysis
Trainee run summary
- Replaced the previous trainee run visualization with a new summary dashboard
- Presents a completed run back to the trainee, covering how it concluded and how it stands against other runs on the instance
- Contains feedback overview, overall speed vs score, level percentiles, scoreboard, assists coverage, cumulative score, time vs score and event timeline
Score export
- Reworked training instance score export, now broken down per level and splitting the assessment score from the training score
- Exports as CSV, replacing the previous plain text download
- Exports rank, login, name, mail, state, start and end time, duration, one column per scored level, training score, assessment score, total, hints taken, wrong answers and solutions displayed
- Levels a trainee never attempted export as a dash rather than a zero
Training definition editor
- Improved EMI question edit visuals
- Leaving Test mode restores each question's original required setting, instead of leaving every question forced to required
Topology
- Fixed crashes on multihomed VM nodes, which were emitted once per attached network and collided on duplicate identifiers
- Nodes whose operating system is not recognised no longer show a mismatched OS icon
- Internet node graphic is generated asynchronously, and failures are handled rather than breaking the graph
Sandbox
- Pool comments apply immediately and roll back if saving fails
- Pool comment length is capped
- Prompts before leaving pool edit with unsaved changes
- Creating a sandbox definition shows a loading state, and repeated Enter presses can no longer submit it twice
User and group
- Reworked microservice roles around a fixed default role, which every user of that microservice receives, cannot be deleted, and is always present so a microservice can never be left without one
- Adding a role moves focus straight into it
- Groups with no members or no roles say so, rather than showing an empty table
- Minor visual and behavioural improvements across user, group and microservice management, covering unsaved changes prompts and support for users without an email address
Navigation and home
- Home page hides agenda sections the user holds no role for, and shows a message if no agendas are accessible
- Users with access to a single agenda are taken directly to it instead of through the home page
- Fixed Design navigation offering Pool and Sandbox Images based on the wrong roles
- Navigating to an entity that does not exist redirects instead of failing
Internal
- New event query engine backing every chart, with events syncing into a local SQLite database in a web worker so charts query it instead of the network
- Sync tracks a watermark per instance and event type, so only new events are fetched
- Entity references on event rows resolve to full entities through a dedicated resolver
- Only one browser tab may own the local cache; other tabs are shown a blocked page and resume once it is freed
- Cached instances are evicted by age and total size on startup
- Cached batch fetch of entities by identifier resolves each id from a local cache and requests only the ones missing
- Cache lifetimes and maximum size are configurable, and polling periods are configured as duration strings
- Charts stop polling while the browser tab is hidden, and resume when it returns
- Route resolvers rewritten to fetch an entity once per navigation and share it across title and breadcrumb
- Unsaved changes tracking and its route guard extracted for reuse across agendas
- Pagination types moved from the Sentinel package into the shared utils library
- Replaced moment with date-fns for all duration handling
- Shared Vitest configuration adopted across every module, with a new test utilities library
- Theme gains spacing, font size and font weight token scales, and a card header style
🙌 Thanks to all contributors in this release:
Full Changelog: v2.5.3...v3.1.0