Agent Runtime Manual Test Plan
Branch: main
PR Reference: #32
Setup
Create ~/.openjarvis/config.toml:
For every test case, record: Pass / Fail / Partial / Blocked, what you actually saw, and screenshots for any UI issues.
Part 1: CLI (jarvis agents)
1.1 Commands exist
| # |
Test |
Expected |
| 1 |
jarvis agents --help |
Shows all subcommands: launch, start, stop, run, status, logs, daemon, watch, recover, errors, ask, instruct, messages, list, info, create, pause, resume, delete, bind, channels, search, templates, tasks |
1.2 Agent lifecycle: create → run → pause → resume → delete
| # |
Test |
Expected |
| 2 |
jarvis agents launch |
Wizard: template list → name/schedule/tools/budget/learning prompts → creates agent, prints ID |
| 3 |
jarvis agents list |
Agent appears, status=idle |
| 4 |
jarvis agents status |
Table: name, status dot, schedule, last run, runs=0, cost=$0 |
| 5 |
jarvis agents run <id> |
Prints progress then "Tick complete. Status: idle, runs: 1" |
| 6 |
jarvis agents status |
runs=1, last run time updated |
| 7 |
jarvis agents pause <id> then status |
Status shows paused |
| 8 |
jarvis agents resume <id> then status |
Status back to idle |
| 9 |
jarvis agents delete <id> then list |
Agent gone (soft-deleted/archived, not in list) |
1.3 Agent creation variants
| # |
Test |
Expected |
| 10 |
jarvis agents create "Test Agent" |
Creates agent by name, prints ID |
| 11 |
jarvis agents create --template <template_name> |
Creates from template, inherits template config |
| 12 |
jarvis agents launch → pick a template |
Wizard pre-fills config from template |
| 13 |
jarvis agents launch → pick "Custom Agent" |
Wizard starts with blank config |
| 14 |
jarvis agents templates |
Lists built-in + user templates with descriptions |
1.4 Scheduling
| # |
Test |
Expected |
| 15 |
Create agent with schedule_type=interval, schedule_value=30 |
Created |
| 16 |
jarvis agents start <id> |
"Agent registered with scheduler" |
| 17 |
jarvis agents stop <id> |
"Agent deregistered from scheduler" |
| 18 |
jarvis agents daemon |
Starts, prints agent count, blocks. Ctrl+C → "Daemon stopped." clean exit |
| 19 |
Create agent with schedule_type=cron, schedule_value="*/5 * * * *" |
Created |
| 20 |
jarvis agents start <id> (cron agent) |
Registered, next fire time displayed or logged |
| 21 |
Create agent with schedule_type=manual then start <id> |
Agent registered but never auto-fires |
1.5 Interaction: ask / instruct / messages
| # |
Test |
Expected |
| 22 |
jarvis agents ask <id> "What is 2+2?" |
Runs tick, prints agent response inline |
| 23 |
jarvis agents messages <id> |
Shows user→agent ask + agent→user response |
| 24 |
jarvis agents instruct <id> "Focus on ML papers" |
"Instruction queued for next tick" |
| 25 |
jarvis agents messages <id> |
Queued instruction shows [queued], status=pending |
| 26 |
jarvis agents run <id> then messages <id> |
Queued message now delivered, status changes from pending |
| 27 |
jarvis agents ask <id> "" (empty message) |
Graceful error or rejection, no crash |
| 28 |
jarvis agents instruct <id> with very long message (>1000 chars) |
Accepted and stored correctly |
1.6 Error recovery & monitoring
| # |
Test |
Expected |
| 29 |
jarvis agents errors |
Lists agents in error/needs_attention/stalled/budget_exceeded (or empty table) |
| 30 |
jarvis agents recover <id> (on errored agent) |
Restores checkpoint, status → idle |
| 31 |
jarvis agents recover <id> (on idle agent) |
Clear message: "Agent is not in error state" or similar |
| 32 |
jarvis agents logs <id> |
Recent traces with tick IDs and timestamps |
| 33 |
jarvis agents logs <nonexistent_id> |
Clear error: "Agent not found" |
| 34 |
jarvis agents watch (then run a tick in another terminal) |
Events stream live: AGENT_TICK_START, AGENT_TICK_END visible. Ctrl+C to stop. |
| 35 |
jarvis agents watch <id> |
Same, filtered to one agent only |
| 36 |
jarvis agents watch then Ctrl+C |
Clean exit, no traceback, no hanging threads |
1.7 Agent info & inspection
| # |
Test |
Expected |
| 37 |
jarvis agents info <id> |
Shows agent type, status, memory snippet, tasks, channels, config details |
| 38 |
jarvis agents tasks <id> |
Lists tasks with statuses (or empty state) |
| 39 |
jarvis agents channels <id> |
Lists channel bindings (or empty state) |
| 40 |
jarvis agents search "keyword" |
Searches across agent traces, returns relevant results |
1.8 Edge cases & invalid input
| # |
Test |
Expected |
| 41 |
jarvis agents run <nonexistent_id> |
Clear error: "Agent not found" — no Python traceback |
| 42 |
jarvis agents pause <id> twice |
Second pause is no-op or clear message, no crash |
| 43 |
jarvis agents resume <id> (already idle) |
No-op or clear message, no crash |
| 44 |
jarvis agents run <id> while another tick is running |
Concurrency guard: "Agent is already running" error |
| 45 |
jarvis agents delete <id> then run <id> |
Clear error about deleted/archived agent |
| 46 |
Create agent with invalid cron expression |
Rejected with clear validation error |
| 47 |
Create agent with negative budget |
Rejected or clamped to 0 |
1.9 CLI aesthetics
| # |
Check |
Expected |
| 48 |
status table formatting |
Columns aligned, readable at 80-char terminal width |
| 49 |
Error messages (run with no engine configured) |
Clear human-readable message, no Python tracebacks |
| 50 |
launch wizard prompts |
Clear labels, sensible defaults, no confusing jargon |
| 51 |
watch event stream |
Color-coded, event type + agent name visible, timestamps |
| 52 |
list table with 0 agents |
"No agents found" or empty table — not a crash |
| 53 |
list table with 10+ agents |
Table remains readable, no column overflow |
| 54 |
All commands with --help |
Every subcommand has a help string |
Part 2: Web Frontend
2.0 Setup
Open http://localhost:5173, navigate to Agents page via sidebar.
2.1 Navigation & routing
| # |
Test |
Expected |
| 55 |
Click "Agents" in sidebar |
AgentsPage renders, URL is /agents |
| 56 |
Direct navigation to /agents |
Page loads correctly (no blank screen) |
| 57 |
Browser back/forward after visiting agent detail |
Navigation works, state preserved |
2.2 List view
| # |
Test |
Expected |
| 58 |
Page loads with backend running |
No console errors, agent list renders |
| 59 |
Page loads with backend down |
User-visible error message (not blank white screen), no console exceptions |
| 60 |
Agent cards |
Name, color status dot, schedule description, last run time, runs count, cost |
| 61 |
"Run Now" button |
Triggers tick, card updates (runs count increments, last run time updates) |
| 62 |
Pause/Resume button |
Toggles status, dot color changes immediately |
| 63 |
Agent list auto-refresh |
After running a tick via CLI, the web list eventually reflects the updated state |
| 64 |
10+ agents in list |
Cards render without performance issues, scroll works |
2.3 Launch wizard
| # |
Test |
Expected |
| 65 |
Click "Launch Agent" |
Modal appears: Step 1 template picker with templates + "Custom Agent" option |
| 66 |
Templates load from API |
Template cards display with names and descriptions |
| 67 |
Select template → Next → Step 2 |
Config form: name (pre-filled from template), schedule_type dropdown, schedule_value, tools checkboxes, budget, learning toggle (off) |
| 68 |
Select "Custom Agent" → Next → Step 2 |
Config form with blank name, no pre-filled values |
| 69 |
Next → Step 3 |
Review summary of all config values |
| 70 |
Click Launch |
Agent created, modal closes, new agent appears in list |
| 71 |
Back button at Step 2 |
Returns to Step 1, template selection preserved |
| 72 |
Back button at Step 3 |
Returns to Step 2, all form inputs preserved |
| 73 |
Launch with empty name |
Inline error: "Agent name is required" — modal stays open |
| 74 |
Launch with all tools selected |
All tools included in review and in created agent config |
| 75 |
Click outside modal / press Escape |
Modal closes (or stays open — document behavior) |
| 76 |
Schedule type = "Manual" |
schedule_value input is disabled/hidden |
| 77 |
Schedule type = "Cron" |
schedule_value placeholder shows cron example |
| 78 |
Schedule type = "Interval" |
schedule_value placeholder shows seconds example |
2.4 Detail view (click an agent)
| # |
Test |
Expected |
| 79 |
Click agent card |
Detail view opens with tabbed interface |
| 80 |
Overview tab |
Stat cards (Total Runs, Success Rate, Total Cost), config display, channels list, action buttons |
| 81 |
Overview action buttons |
Run Now, Pause, Resume visible and functional |
| 82 |
Interact tab |
Chat message list, textarea, "Immediate" and "Queue" send buttons |
| 83 |
Send immediate message |
Appears in chat with user styling, agent responds after tick |
| 84 |
Send queued message |
Shows with "queued" badge, status=pending |
| 85 |
Send empty message |
Button disabled or graceful rejection — no empty message sent |
| 86 |
Rapid-fire send (click Send multiple times quickly) |
No duplicate messages, no race condition errors |
| 87 |
Chat auto-scroll |
New messages scroll into view automatically |
| 88 |
Tasks tab |
Task list with status badges (completed=green, failed=red, active=blue, pending=gray) |
| 89 |
Tasks tab (no tasks) |
Empty state: "No tasks assigned." |
| 90 |
Memory tab |
summary_memory text displayed in readable format |
| 91 |
Memory tab (no memory) |
Empty state: "Agent has no stored memory yet." |
| 92 |
Learning tab |
Toggle switch (read-only, off by default), placeholder text for future events |
| 93 |
Logs tab |
Placeholder / empty state message (not a crash or blank) |
| 94 |
Tab switching — rapid clicks |
All 6 tabs render instantly, no layout shift, no flash of wrong content |
2.5 Error states
| # |
Test |
Expected |
| 95 |
Agent in error status |
Red status dot/badge, "Recover" button visible |
| 96 |
Click Recover |
Status resets to idle, dot turns green |
| 97 |
Agent in needs_attention status |
Amber badge visible |
| 98 |
Agent in budget_exceeded status |
Orange badge visible |
| 99 |
Agent in stalled status |
Yellow badge visible |
| 100 |
Backend goes down while page is open |
Next refresh/action shows error — not silent failure |
| 101 |
Delete agent → confirm it disappears from list |
Agent removed from list immediately (or on next refresh) |
| 102 |
Delete agent (no confirmation dialog in web) |
Document: Is instant delete OK or should there be a confirm? |
| # |
Test |
Expected |
| 103 |
Click "..." menu on agent card |
Dropdown with Delete + other options |
| 104 |
Click Delete from menu |
Agent deleted, list updates |
| 105 |
Click outside dropdown |
Dropdown closes |
2.7 Web aesthetics & UX
| # |
Check |
Expected |
| 106 |
Status dot colors |
idle=#22c55e, running=#3b82f6, paused=#6b7280, error=#ef4444, needs_attention=#f59e0b, budget_exceeded=#f97316, stalled=#eab308 |
| 107 |
Launch wizard spacing/alignment |
Modal centered, steps clearly numbered, form inputs aligned, no overlap |
| 108 |
Detail view tab switching |
Instant, no layout shift or flash |
| 109 |
Interact tab chat feel |
Messages visually distinct (user=right vs agent=left or different colors), auto-scroll, clear input area |
| 110 |
Responsive at 1024px width |
No overflow or cut-off content, agent cards reflow |
| 111 |
Responsive at 1440px width |
Proper use of space, no excessive stretching |
| 112 |
Responsive at 768px width (tablet) |
Still usable, no broken layout |
| 113 |
Empty states |
"No agents yet" + CTA button / "No messages" / "No tasks" — not blank white space |
| 114 |
Loading states |
"Loading agents..." shown during fetch, spinner or skeleton |
| 115 |
Page title / browser tab |
Meaningful title (not just "Vite App") |
| 116 |
Console errors |
Zero console errors during normal usage flow |
Part 3: Desktop App
3.0 Setup
Navigate to the Agents tab.
3.1 Functionality
| # |
Test |
Expected |
| 117 |
Left panel: agent list |
Status dots, schedule descriptions, last run times |
| 118 |
Click agent → right panel |
Tabbed detail view (Overview, Interact, Tasks, Memory, Learning, Logs) |
| 119 |
No agent selected |
Right panel shows "Select an agent to view details" |
| 120 |
"Launch Agent" button |
Opens wizard, same 3-step flow as web |
| 121 |
Launch wizard → Create agent |
Agent appears in left panel list |
| 122 |
Overview tab |
Key-value stats (Status, Agent Type, Schedule, Last Run, Total Runs, Total Cost, Budget) + action buttons (Run Now, Pause, Resume, Recover) |
| 123 |
Interact tab |
Chat UI, mode toggle (immediate/queued), Enter shortcut sends message |
| 124 |
Send immediate message |
Response appears in chat |
| 125 |
Send queued message |
Shows as pending |
| 126 |
Tasks tab |
Task list with colored status badges + created-at timestamps |
| 127 |
Memory tab |
summary_memory in monospace font |
| 128 |
Learning tab |
Shows enabled/disabled status + placeholder text |
| 129 |
Logs tab |
Placeholder: "Log streaming not yet connected." |
| 130 |
Auto-refresh |
Agent list refreshes on ~10s interval (verify with CLI-triggered state change) |
| 131 |
Delete agent via desktop |
Confirmation dialog appears, agent removed on confirm |
3.2 Desktop edge cases
| # |
Test |
Expected |
| 132 |
Backend not running → open desktop app |
Error state shown, not a crash |
| 133 |
Backend dies while desktop is open |
Graceful degradation on next action/refresh |
| 134 |
Selected agent deleted via CLI → desktop refreshes |
Selected agent deselects, list updates |
3.3 Desktop aesthetics
| # |
Check |
Expected |
| 135 |
Catppuccin color scheme consistent |
idle=#a6e3a1, running=#89b4fa, paused=#6c7086, error=#f38ba8, needs_attention=#fab387, stalled=#f9e2af |
| 136 |
Left/right panel split |
Resizable or fixed at reasonable ratio, no overlap |
| 137 |
Tab switching |
Smooth, no flicker |
| 138 |
Launch wizard modal |
Properly overlays content, dismissible with Escape or outside click |
| 139 |
Text readability |
Font sizes consistent, sufficient contrast against dark background |
| 140 |
Window resize |
Layout adapts, no overflow or clipping |
| 141 |
Status badge consistency with web |
Same statuses map to same semantic colors (green=idle, blue=running, etc.) |
Part 4: API Backend (Direct)
4.1 REST endpoint smoke tests
Run with uv run jarvis serve and test via curl or Postman.
| # |
Test |
Expected |
| 142 |
GET /v1/managed-agents |
200, returns [] or agent list JSON |
| 143 |
POST /v1/managed-agents with valid body |
200/201, returns created agent JSON with id |
| 144 |
POST /v1/managed-agents with empty body |
422 or 400 with validation error |
| 145 |
GET /v1/managed-agents/<id> |
200, returns single agent |
| 146 |
GET /v1/managed-agents/<bad_id> |
404, returns error JSON |
| 147 |
POST /v1/managed-agents/<id>/run |
200, tick executes |
| 148 |
POST /v1/managed-agents/<id>/pause |
200, status changes to paused |
| 149 |
POST /v1/managed-agents/<id>/resume |
200, status changes to idle |
| 150 |
POST /v1/managed-agents/<id>/recover |
200 if errored, appropriate error if not |
| 151 |
DELETE /v1/managed-agents/<id> |
200, agent archived |
| 152 |
GET /v1/templates |
200, returns template list |
| 153 |
POST /v1/templates/<id>/instantiate |
200, creates agent from template |
| 154 |
GET /v1/agents/errors |
200, returns list of problem agents |
| 155 |
GET /v1/agents/health |
200, returns health summary |
4.2 Message endpoints
| # |
Test |
Expected |
| 156 |
POST /v1/managed-agents/<id>/messages with {"content":"hi","direction":"user_to_agent","mode":"immediate"} |
200, message stored |
| 157 |
GET /v1/managed-agents/<id>/messages |
200, returns message list |
| 158 |
POST /v1/managed-agents/<id>/messages with {"content":"","direction":"user_to_agent","mode":"immediate"} |
422 or graceful handling |
| 159 |
POST /v1/managed-agents/<id>/messages with {"content":"cmd","direction":"user_to_agent","mode":"queued"} |
200, message has status=pending |
4.3 Task & channel endpoints
| # |
Test |
Expected |
| 160 |
GET /v1/managed-agents/<id>/tasks |
200, returns task list |
| 161 |
POST /v1/managed-agents/<id>/tasks |
200, creates task |
| 162 |
GET /v1/managed-agents/<id>/channels |
200, returns channel bindings |
| 163 |
GET /v1/managed-agents/<id>/state |
200, returns full agent state |
4.4 WebSocket events
| # |
Test |
Expected |
| 164 |
Connect to ws://localhost:8222/v1/agents/events |
Connection established |
| 165 |
Trigger a tick → observe WS messages |
Receive AGENT_TICK_START and AGENT_TICK_END events |
| 166 |
Connect with ?agent_id=<id> filter |
Only events for that agent |
| 167 |
Disconnect cleanly |
No server error logs |
Part 5: Cross-Platform Consistency
| # |
Test |
Expected |
| 168 |
Create agent via CLI → check web + desktop |
Same name, status, config everywhere |
| 169 |
Run tick via CLI → check web + desktop |
Run count and last run time update in both UIs |
| 170 |
Send message via web Interact → check CLI messages |
Same content, direction, mode |
| 171 |
Pause via desktop → check CLI status + web |
paused everywhere |
| 172 |
Delete via web → check CLI list + desktop |
Gone everywhere |
| 173 |
Create via web wizard → check CLI list + desktop |
Agent visible in all three |
| 174 |
Recover via CLI → check web + desktop |
Status back to idle in all UIs |
| 175 |
Send queued message via CLI instruct → check web Interact |
Message shows with pending/queued status |
| 176 |
Multiple agents created from different clients |
All agents appear correctly in all views |
Part 6: Stress & Concurrency
| # |
Test |
Expected |
| 177 |
Run tick on same agent from two terminals simultaneously |
Concurrency guard blocks second tick: "Agent is already running" |
| 178 |
Create 20+ agents → check list performance |
All clients render list without lag |
| 179 |
Rapidly pause/resume same agent |
All state transitions correct, no stuck states |
| 180 |
Run daemon + manual run at same time |
No double-ticking, concurrency guard holds |
| 181 |
Delete agent while tick is in progress |
Tick completes or fails gracefully, agent ends up archived |
Part 7: Deferred Features (Placeholder Verification)
Confirm these show placeholders (not crashes):
| # |
Feature |
CLI |
Web |
Desktop |
| 182 |
Budget enforcement |
run still works even if cost > budget |
No enforcement, budget is display-only |
Same |
| 183 |
Stall detection |
No automatic stall detection fires |
N/A |
N/A |
| 184 |
Learning event timeline |
Learning tab shows placeholder text |
Same |
Same |
| 185 |
Logs trace replay |
Logs tab shows placeholder text |
Same |
Same |
| 186 |
POST /v1/skills |
N/A |
N/A |
Returns "not_implemented" |
| 187 |
POST /v1/optimize/runs |
N/A |
N/A |
Returns placeholder run_id |
| 188 |
GET /v1/feedback/stats |
N/A |
N/A |
Returns {total: 0, mean_score: 0.0} |
Deliverables
1. Test results — Spreadsheet with columns: #, Status (Pass/Fail/Partial/Blocked), Actual Behavior, Screenshot (for UI issues).
2. Bug list — Each bug: steps to reproduce, expected vs actual, severity (Critical/Major/Minor), screenshot.
3. UX & aesthetics feedback — Is the launch wizard clear? Are status colors distinguishable? Does the Interact tab feel like chat? Is CLI output readable? Are error messages helpful? Is the delete-without-confirm behavior in web acceptable?
4. API error handling audit — Document all cases where the frontend silently swallows errors (currently: agent list fetch, interact tab sends). Recommend which should show user-visible errors.
5. Deferred features check — Confirm placeholder items in Part 7 show graceful stubs (not crashes or blank screens).
Notes
- Backend (
jarvis serve) must be running for web and desktop (default port 8222).
- Without an engine configured,
run/ask will error — document whether the error message is clear.
daemon and watch block — Ctrl+C to exit.
- Web frontend API client has unused functions (
updateManagedAgent, createAgentTask, fetchAgentState, fetchErrorAgents) — not a bug, but note for future.
- Desktop API client is missing some endpoints that the web client has (
fetchAgentChannels, fetchAgentState, fetchErrorAgents) — may affect feature parity.
- Frontend has no automated tests — all testing is manual per this plan.
- Both frontends silently catch API errors (
.catch(() => {})) — this is a known UX gap to evaluate.