- Backend (LLM Gateway):
- Record structured 'llm_stream_reset' event with discard action, failure reason, and retry messaging on mid-stream generation errors.
- Add unit test verifying stream reset event payload on mid-stream errors.
- Frontend (Showcase UI):
- Handle 'llm_stream_reset' events in agent service and stream aggregator, discarding interrupted chunks while showing retry indicators.
- Establish a single source of truth for tool and action events in the timeline to eliminate duplicated action rows while retaining ADB and explorer tools.
- Add @angular/cdk dependency and update agent stream component styling and layout.
- Add unit tests for stream aggregation and tool display filtering.
Fix queue cancellation, concurrency limits and worker status updates.
Use direct Explorer imports, split the Diagnoser loop into helpers and remove unused tool registration and prompt-builder code.
Correct model caching, endpoint selection and retry handling.
Add execution incidents, action bursts and shared Flash history.
Expose verification and Explorer settings with streamed check results.
Support graceful cancellation, recording recovery and bundled UI resources.
Add CI quality checks and clean up comments and documentation.
- Extract device action execution into artemis/mcp action layer:
typed ActionResult, capability manifest with startup validation,
AdbActuator as the single physical implementation, in-memory
ActionSession (replaces stdio subprocess MCP in validator), and
McpActionExecutor preserving the legacy executor contract.
adb_server keeps its external stdio/SSE surface unchanged and now
reuses the actuator implementation; import-time side effects moved
into configure_stdio_mode().
- Capability-gated prompt assembly (prompt_assembly.py): tool enums and
teaching segments render per available backend tools; full-set output
is byte-identical to the previous static text (locked by tests).
- Admin console task queue: serial worker replaced by a per-device
concurrent dispatcher (ARTEMIS_CONCURRENCY_MODE=global restores
serial semantics), per-session cancellation, strict device binding on
enqueue, unified stdio piping with tee to trace stdout.log, and
shutdown cleanup of all active runs. Fix _pid_exists exception order
so PermissionError is treated as alive.
- mcp_server reliability: spawn watchdog kills runners stuck before
interpreter startup and releases device reservations; task state
reconcile uses psutil liveness, prefers runner-reported pids, and
adds a 45s startup grace to stop false failure reports on Windows;
conversation_id is now optional end-to-end; explicit device_serial is
validated at submission.
- CLI install now writes ~/.claude/rules/artemis.md for Claude Code and
migrates/removes the legacy CLAUDE.md injection block; ~/.claude.json
is never rewritten when it fails to parse.
- Tests: Windows-portable stdio lifecycle and path assertions; new
suites for action layer, prompt assembly, spawn watchdog, and task
reconcile (895 passed, 3 skipped).
- Backend: maintain _step_number_cache in DataEngine and include step_number in all step_updated SSE events (summary, thinking, execution result)
- Admin console: query unassigned trace step_ids in stepless_rows to prevent orphan traces from being lost
- Showcase UI: implement dual-indexed entity deduplication (by step_id and step_number) in extractStepReplayFrames to eliminate phantom ghost steps
- Showcase UI: filter visual screenshot steps before generating sequential 1-based frame numbers, preventing step-4 start and index shift bugs
- Showcase UI: add rawStepNumber and summary properties to StepReplayFrame
- Showcase UI: update FloatingVideoPlayerComponent session reset effect to only reset playback on sessionId change rather than on every stepFrames mutation
- Showcase UI: add stepSeekRequest signal and stepIndex parameter to AgentService.openVideoPlayer
- Unit tests: add Karma and Pytest unit tests verifying step 1 start, dual-indexing, and SSE step_number payloads