Skip to content

feat: extract in-process MCP action layer, concurrent task dispatch, and spawn/reconcile hardening - #11

Merged
somew1nd merged 1 commit into
mainfrom
feat/action-layer-concurrent-dispatch
Aug 28, 2026
Merged

feat: extract in-process MCP action layer, concurrent task dispatch, and spawn/reconcile hardening#11
somew1nd merged 1 commit into
mainfrom
feat/action-layer-concurrent-dispatch

Conversation

@weilinliu

Copy link
Copy Markdown
Collaborator

Summary

  • In-process MCP action layer (artemis/mcp/action_*, actuators/): typed ActionResult, capability manifest validated at session startup, AdbActuator as the single physical implementation, in-memory ActionSession replacing the stdio-subprocess MCP in the validator (fixes the Windows spawn failure path), and McpActionExecutor preserving the legacy executor contract. adb_server keeps its external stdio/SSE surface unchanged and reuses the actuator implementation.
  • 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, stdio piping with tee to trace stdout.log, shutdown cleanup of all active runs, and a fix for _pid_exists exception ordering (PermissionError now 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 optional end-to-end; explicit device_serial validated at submission.
  • CLI install: 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.

Test plan

  • Full unit suite: 895 passed, 3 skipped (Windows, project venv).
  • New suites: action manifest/server/session, actuators, prompt assembly (byte-stability pins), spawn watchdog, task reconcile.

…and spawn/reconcile hardening

- 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).
@somew1nd somew1nd self-assigned this Aug 28, 2026
@somew1nd
somew1nd merged commit 3cc711d into main Aug 28, 2026
7 checks passed
@weilinliu
weilinliu deleted the feat/action-layer-concurrent-dispatch branch August 28, 2026 16:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants