WI: Implement anima-qa MCP server (HTTP + JSON-RPC) #181
Closed
opened 2026-05-24 05:10:18 +00:00 by toasterson
·
0 comments
No Branch/Tag specified
main
claude/wi-019ff2f6-create-work-item-ignores-current-phase-d
claude/wi-019fd84d-two-layer-operator-scope-property-mint-p
claude/wi-019fbe99-lane-faults-are-billed-to-work-items-sic
claude/wi-019fd84d-pwa-renders-turnoutcome-by-recovery-axis
claude/wi-019fe0e9-finish-the-pwa-phase-axis-cutover-on-cur
claude/wi-019fd84c-buf-breaking-change-ci-wire-json-across
claude/wi-019ff2f4-reproduce-a-hung-acp-session-on-demand-p
claude/wi-019fd84b-anima-mq-v1-proto-envelope-package-broke
claude/wi-019fc44d-pre-push-test-gate-iterations-are-witnes
claude/wi-019f9079-wi-2-acp-over-vsock-transport-in-anima-r
claude/wi-019ff0c1-test-network-subnet-collision-something
claude/wi-01a00b8c-ci-verdict-pipeline-is-fully-dead-orches
migration-verification-20260818
claude/wi-019fa954-mcp-proxy-registry-sessions-get-one-endp
claude/wi-019fd3c0-pwa-image-tag-lives-in-a-raw-pwa-yaml-th
claude/wi-019fa59c-double-gate-a-second-review-phase-where
claude/wi-019fc2cc-ci-infrastructure-failures-qemu-ssh-rese
claude/wi-019fe0f2-trace-scheduler-decisions-runner-attachm
claude/wi-019fce0d-reviewer-verdicts-are-not-persisted-to-w
claude/wi-019fe0f2-expose-bounded-fleet-and-work-flow-metri
claude/wi-019fe0f7-cut-gate-reads-to-phase-state-verify-adr
claude/wi-019fe0f2-restore-dashboardservice-against-the-mig
claude/wi-019fa59b-publish-transient-chunk-deltas-to-a-per
claude/wi-019fe0ee-checkpoint-typed-progress-witnesses-and
claude/wi-01a00c91-builds-escape-the-per-slot-cargo-target
claude/wi-019fd894-plan-canvas-wi-dependency-graph-with-fro
claude/wi-01a00ec5-a-timed-out-turn-discards-the-worktree-a
claude/wi-01a004d3-build-the-runner-image-in-ci-from-docker
claude/wi-01a00afa-runner-write-safe-directory-entries-to-g
claude/wi-01a009dc-circuit-breaker-state-fails-to-load-on-e
claude/wi-019ff175-adr-0038-acp-has-no-structured-agent-to
claude/wi-01a005fc-the-acp-brief-carries-the-description-bu
claude/wi-01a00462-a-runner-blocked-session-is-unreapable-t
claude/wi-019ff173-pwa-chat-anchor-the-user-s-message-to-th
claude/wi-01a00463-anima-runner-leaks-its-executor-child-on
claude/wi-019fe61e-agent-sessions-have-no-git-push-credenti
claude/wi-019ff2f4-stamp-liveness-witnesses-from-the-acp-ch
claude/wi-019fd84c-witness-and-park-logic-consume-the-turno
claude/wi-019fd84c-runner-stops-relabeling-human-cancels-ca
claude/wi-019fd84c-turnoutcome-closed-14-variant-proto-enum
claude/wi-019fd84c-afk-dispatch-requires-a-requested-outcom
claude/wi-019fd84d-break-glass-reset-reason-every-operator
claude/wi-019fd84d-divergence-report-db-vs-registry-vs-brok
claude/wi-019ff174-pwa-chat-make-a-tool-call-say-what-it-is
claude/wi-019fe0f0-reap-heartbeat-live-but-activity-dead-tu
claude/wi-019fe0ee-persist-scheduling-clocks-and-leases-so
claude/wi-019ff093-mark-implementation-complete-advances-wo
claude/wi-019ff174-pwa-chat-summarise-a-finished-turn-s-wor
claude/wi-019fd894-satisfied-edges-feed-context-dependency
claude/wi-019fe1d3-no-runner-can-reach-dind-so-the-janitor
claude/wi-01a009dc-quota-probe-kills-the-claude-code-lane-a
claude/wi-019fe251-the-pre-push-gate-runs-tests-but-not-cli
claude/wi-019fdd2a-lane-quota-detection-uses-a-total-turn-t
claude/wi-019fd894-orphaned-edges-and-blocked-visibility-pa
claude/wi-019fd894-dependency-edge-api-surface-grpc-mcp-too
claude/wi-019fd893-edge-witness-kind-dependent-satisfaction
claude/wi-01a0057c-sessions-finish-with-no-captured-diff-an
claude/wi-019fa59e-retire-failed-dispatch-count-per-item-ph
claude/wi-019fd895-anima-server-wedges-grpc-mcp-accept-conn
claude/wi-019fce0d-in-flight-ceiling-stranded-working-queue
claude/wi-019fd84c-sidechannel-detection-runner-flags-branc
claude/wi-019fff95-the-runner-s-anima-owner-worktree-tag-is
claude/wi-019fe0f0-add-immutable-graph-version-records-and
claude/wi-019fbe42-inventory-every-psql-kubectl-recipe-oper
claude/wi-019fe0f7-move-exit-bar-state-onto-pinned-phase-in
claude/wi-019ff075-an-orphaned-solstice-dispatch-strands-a
claude/wi-019ff173-pwa-chat-pin-the-pending-permission-esca
agent/19ce972d63dc
agent/972084064aa3
claude/wi-019fe0e9-operator-watch-set-board-backed-by-bound
claude/wi-019fe0e9-clean-addressed-session-exchange-after-l
claude/wi-019fa59e-detect-session-death-by-routability-mand
claude/wi-019fe706-solstice-rabbitmq-is-degraded-job-reques
claude/wi-019fe18f-the-pre-push-test-gate-bills-toolchain-f
claude/wi-019fe0e9-audited-reconcile-session-releases-zombi
claude/wi-019fe0e9-use-one-durable-https-credential-path-fo
claude/wi-019fe6f2-stranded-work-items-drowns-real-strandin
claude/wi-019fe6fd-pwa-data-error-51-items-without-workflow
claude/wi-019fec06-items-with-a-changes-requested-review-ve
claude/wi-019fe0f0-cache-provider-quota-back-off-failures-a
claude/wi-019fe0e9-pin-the-rust-toolchain-and-make-ci-repor
claude/wi-019fce0d-unpark-work-item-mcp-tool-one-audited-un
claude/wi-019fe0ee-assemble-each-agent-turn-from-durable-ho
claude/wi-019fe0ee-codify-the-anima-owned-horizon-boundary
claude/wi-019fe0e7-re-implement-owner-tagged-resource-reape
claude/wi-019fd893-dependency-edges-table-dag-write-path-de
claude/wi-019fce0d-operator-scheduling-controls-over-mcp-ho
claude/wi-019fd84d-interleaved-refusal-witnesses-indefinite
claude/wi-019fdd2a-a-fully-cleared-exit-bar-does-not-advanc
claude/wi-019fd898-corrective-resume-dispatch-to-an-acp-gat
claude/wi-019fe5fd-approve-and-merge-refuses-heads-whose-gr
claude/wi-019fe624-testing-phase-items-with-a-moved-head-ha
claude/wi-019fdd4c-the-24h-in-flight-ceiling-has-no-operato
claude/wi-019fa5a0-move-the-dashboard-onto-the-activity-fan
claude/wi-019fe0f2-add-one-shared-otlp-observability-initia
claude/wi-019fce4e-approve-and-merge-no-already-merged-shor
claude/wi-019fce0d-lane-occupancy-over-mcp-list-sessions-by
claude/wi-019fbdc4-pwa-plan-detail-workflow-graph-define-im
claude/wi-019fd86c-worktree-prep-rebase-parks-items-that-va
claude/wi-019fa96b-session-project-binding-covers-work-item
claude/wi-019fdd87-a-failed-turn-does-not-roll-back-mark-im
claude/wi-019fe0f0-add-audited-cancelsession-that-terminate
claude/wi-019fcde5-work-items-cannot-be-looked-up-by-their
claude/wi-019fa5a0-persist-the-assembled-prompt-to-s3-along
claude/wi-019fa59f-reviews-land-in-the-thread-and-reviewers
claude/wi-019fbdc3-pwa-workflowgraph-node-component-workflo
claude/wi-019fa5a0-single-active-consumer-akh-lanes-and-rel
claude/wi-019faa5d-nothing-prunes-session-tokens-104-083-ro
claude/wi-019fa59c-graph-versioning-pin-in-flight-work-item
claude/wi-019fa59c-anima-work-exchange-lane-queues-and-the
claude/wi-019fa59d-dispatch-branches-on-phasekind-instead-o
claude/wi-019fa59d-anima-session-addressed-exchange-with-pe
claude/wi-019fa5a0-attempt-counter-in-postgres-surviving-ev
claude/node-workflow-overview-wi-4c95cf
claude/wi-019fc826-the-account-quota-probe-polls-the-provid
claude/grpc-api-surface-evaluation-cd6026
claude/wi-019fc9a5-exit-bar-gates-survive-across-pr-generat
claude/wi-019fa59f-boards-read-the-phase-graph-instead-of-a
claude/wi-019fcce5-implementation-sessions-lack-workitem-wr
claude/wi-019f9fc2-anima-has-no-ssh-credential-story-runner
claude/wi-019f9946-a-work-item-filed-without-a-plan-has-no
claude/wi-019fa3a4-reviewers-cannot-build-the-code-they-rev
claude/wi-019fc638-anima-emits-no-traces-metrics-or-structu
agent/4a6b46e02b58
claude/wi-019fc63c-dispatch-has-no-dependency-graph-work-it
agent/e7469dfa074b
claude/wi-019f9fb1-quota-aware-scheduling-budget-provider-c
agent/2cfe41dbf7f5
claude/wi-019faa43-the-janitor-s-two-sweeps-both-exclude-th
claude/wi-019fcc85-move-cargo-target-dir-from-per-runner-to
claude/wi-019f8615-agents-page-show-each-agent-s-live-slot
agent/1c04647808fc
claude/wi-019dbb8e-auth-for-akh-medu-seshat-envoy-gateway-s
claude/wi-019dc57c-p1-5-seshat-ingest-hook-transcripts-libr
claude/wi-019ddfd9-mcp-tool-time-bounded-out-of-hours-sessi
claude/wi-019e8873-native-solstice-ci-dispatch-send-explici
claude/beautiful-leavitt-d2a8d7
agent/8e80f1909fac
agent/baf43b288ad9
claude/wi-019fc9a5-a-failed-git-push-silently-discards-the
agent/0d500af2cd88
agent/c4a84cf02ec2
claude/wi-019f9ea6-dispatched-sessions-hit-scope-walls-mid
claude/wi-019fc826-the-account-quota-probe-hammers-the-prov
claude/wi-019f98b5-opencode-lane-is-dead-weight-every-turn
claude/wi-019fb430-list-working-document-kinds-omits-ci-ret
agent/cb05e821a3bc
agent/a9ae8f731a77
agent/89755cf8eb3e
claude/wi-019fa59d-error-queue-drainer-park-the-work-item-s
claude/wi-019fc2cc-flaky-test-no-reviewer-dispatched-twice
agent/0c195963cd85
agent/21dbfeaf95c9
agent/30dad6db7aa0
agent/917a59a781d8
agent/b557136f8edf
claude/wi-019fc3bd-park-vs-live-session-race-parks-land-whi
agent/2c4165ec8872
claude/wi-019fa59b-phasekind-enum-and-the-fk-constrained-ph
claude/wi-019fa9f3-dispatch-ordering-does-not-prefer-work-i
claude/wi-019fa8f3-the-scheduler-s-unclaimed-wi-warning-re
claude/wi-019fa59a-dispatch-payload-type-and-the-idempotenc
claude/wi-019fa979-the-reviewer-slot-reservation-is-applied
claude/wi-019fa59b-error-envelope-and-per-lane-error-queues
claude/wi-019fa7d9-an-executor-must-be-able-to-rebase-its-o
claude/wi-019fa59b-seed-the-default-phase-graph-with-ci-to
claude/wi-019fbe41-zombie-session-repair-is-a-raw-sql-sweep
claude/wi-019fbe97-grpc-services-and-mcp-handlers-each-reim
claude/wi-019fbe41-a-stale-recorded-pr-head-breaks-ci-dispa
claude/wi-019fbe41-operator-forensics-needs-psql-no-queryab
claude/wi-019fa59e-retire-anima-sched-max-active-for-runner
claude/wi-019fb424-derive-every-git-remote-config-from-the
claude/wi-019fa3d2-the-ai-gate-ships-no-review-instructions
claude/wi-019f9e06-implement-emit-contextwindowstats-from-p
claude/wi-019fb464-a-review-analysis-wi-that-delivers-its-f
claude/wi-019fa3a4-approve-and-merge-fails-permanently-on-f
claude/wi-019f9e06-implement-a-b-stats-comparison-harness-4
claude/wi-019fb477-per-executor-lane-state-leaks-on-session
claude/wi-019fa59a-anima-mq-crate-topology-declaration-for
claude/wi-019fba1f-witness-output-first-classification-coun
claude/wi-019f9e06-implement-strategy-specific-stats-for-co
claude/wi-019f841f-quick-reply-dedup-options-render-as-bull
archive/wi-410-20260807
claude/wi-019fa5a0-owner-tagged-reaper-for-containers-workt
archive/wi-394-20260807
claude/wi-019fa59e-per-item-phase-revisit-cap-as-workflow-c
claude/wi-019fa59f-surface-the-operator-watch-set-on-the-bo
claude/wi-019fb477-deliverable-reconcile-fails-every-tick-p
claude/wi-019fa59e-migrate-exit-bar-columns-to-phases-and-v
claude/wi-019f8b49-wi-5b-drop-work-items-status-after-the-p
claude/wi-019f841f-live-roster-presence-real-availability-o
claude/wi-019faf95-implementer-runs-the-touched-crates-test
claude/wi-019faf96-migration-086-cannot-run-under-sqlx-inde
claude/wi-019faf95-corrective-dispatch-resumes-the-prior-se
claude/wi-019faf95-refusal-is-not-an-empty-turn-distinct-wi
claude/wi-019fa59f-24-hour-in-flight-ceiling-that-parks-wit
claude/wi-019fb477-rejected-work-item-is-neither-dispatchab
claude/wi-019faf95-session-accounting-capture-per-session-t
claude/wi-019fb40f-a-terminal-worktree-prep-rejection-leaks
claude/wi-019f90ad-scheduler-over-assigns-in-bursts-8-assig
claude/wi-019f860b-pwa-chat-config-pickers-replay-a-dead-se
claude/wi-019f85b9-wi-3-pwa-collapsible-subthread-ui
claude/wi-019f841f-thread-scoped-activity-streaming-retire
claude/wi-019f841e-forward-agent-message-content-blocks-end
claude/wi-019f85b9-wi-2-runner-delegation-reporting-subthre
claude/wi-019f52d2-review-loop-starvation-reviewer-re-dispa
claude/wi-019eab9e-feature-mcp-read-tools-for-session-artif
claude/wi-019e846d-catch-unwired-dead-code-pub-in-pub-mod-h
claude/wi-019faa49-the-per-executor-cap-does-not-hold-acros
claude/wi-019f615e-sia-populate-external-ref-external-state
claude/wi-019dd0b7-wipsnapshot-retention-per-wi-cap-age-pru
claude/wi-019dc0e8-git-remote-url-normalization-ssh-vs-git
claude/wi-019fa9c4-ci-green-is-a-sticky-boolean-with-no-com
claude/wi-019f85b9-wi-1-subthread-domain-model-parent-threa
claude/wi-019f9087-pwa-workitemdetail-request-changes-appro
claude/wi-019f9079-wi-1-spike-gates-the-rest-hypervisor-pic
claude/wi-019f862a-project-overview-in-flight-section-split
claude/wi-019f903c-ci-builds-pushes-multi-arch-deploy-image
claude/wi-019f841e-resource-mentions-in-the-composer-files
claude/wi-019f57aa-message-part-streaming-forward-acp-delta
claude/wi-019e93df-mcp-ambient-get-work-item-detail-full-wi
claude/wi-019e846d-in-server-merge-engine-hardening-anima-g
claude/wi-019dbb9c-agent-annotation-pathway-broken-pat-lack
claude/wi-019faa38-a-ci-green-work-item-awaiting-review-is
claude/wi-019fa5a0-register-session-gate-reject-a-redeliver
claude/wi-019fa902-the-ci-red-corrective-loop-hands-the-imp
claude/wi-019fa945-per-executor-reservation-leaks-a-capped
claude/wi-019f90f9-pwa-delivery-board-is-blind-to-the-phase
claude/wi-019fa7c9-anima-runner-exec-slots-name-is-also-par
claude/wi-019fa59c-distinguish-an-empty-turn-from-a-failed
claude/wi-019f9aa3-ci-lints-against-an-unpinned-toolchain-d
claude/wi-019f9fb8-dispatches-that-fail-before-the-session
claude/wi-019fa59b-progress-witness-pr-aware-per-attempt-re
claude/wi-019f9a17-every-native-ci-dispatch-fires-twice-rec
claude/wi-019f9698-ci-red-corrective-loop-must-distinguish
claude/wi-019f9ec2-a-dropped-amqp-connection-silently-ends
claude/wi-019f84ec-enforce-session-project-binding-on-write
claude/wi-019f903c-fleet-observability-metrics-alerts-for-r
claude/wi-019fa7c6-a-turn-that-only-repairs-the-base-repo-s
claude/wi-019fa7c6-a-rejected-assignment-re-dispatches-ever
claude/wi-019f9b4b-reject-never-reaches-the-implementer-lin
claude/wi-019f9b6e-reviewer-only-is-not-expressible-keeping
claude/wi-019f9ac1-quota-aware-lanes-meter-usage-over-acp-s
claude/wi-019f99ca-native-ci-falls-back-to-a-job-script-tha
claude/wi-019f8610-remove-the-global-anima-sched-max-active
claude/wi-019f990a-analysis-work-parks-itself-17-of-20-park
claude/wi-019f9aa3-a-model-provider-429-is-indistinguishabl
claude/wi-019f99a4-dispatch-queue-ignores-priority-strict-f
claude/wi-019f83ce-wi-a-backend-escalation-core-schema-type
claude/wi-019f98d9-you-cannot-follow-a-wi-along-its-route-1
claude/wi-019f98b5-a-failed-turn-is-indistinguishable-from
claude/account-quota-meter
claude/wi-019fa2fc-the-akh-gateway-advertises-6-slots-for-a
claude/wi-019fa243-every-re-dispatch-throws-away-the-previo
claude/wi-019fa2de-a-review-session-is-dispatched-alongside
claude/wi-019f9e35-worktree-base-branch-is-one-global-env-v
claude/thread-window-redesign-2360d9
claude/wip-lift-rehook
claude/wi-019f9b1d-review-slot-reservation-leaks-when-a-rev
claude/wi-019f99ac-create-project-leaves-new-projects-undis
claude/wi-019f9980-pin-ci-verdicts-to-the-commit-under-test
claude/wi-019f8438-wi-d-frontend-permission-card-render-hum
claude/wi-019f8438-wi-c-runner-interceptor-checkpoint-detec
claude/wi-019f8438-wi-b-executor-token-scope-stripping-q7c
claude/wi-019f8602-reopen-work-items-when-their-orphaned-se
claude/wi-019f90cf-review-analysis-wis-never-close-no-phase
claude/wi-019f90fe-mcp-update-work-item-advertises-status-v
claude/claude-lane-opus-5
claude/wi-019f17e4-user-settings-foundation-store-registry
claude/wi-019f1779-per-user-configurable-inbox-auto-clear-w
No results found.
Labels
Clear labels
Compat/Breaking
Breaking change that won't be backward compatible
Kind/Bug
Something is not working
Kind/Documentation
Documentation changes
Kind/Enhancement
Improve existing functionality
Kind/Feature
New functionality
Kind/Security
This is security issue
Kind/Testing
Issue or pull request related to testing
Priority
Critical
The priority is critical
Priority
High
The priority is high
Priority
Low
The priority is low
Priority
Medium
The priority is medium
Reviewed
Confirmed
Issue has been confirmed
Reviewed
Duplicate
This issue or pull request already exists
Reviewed
Invalid
Invalid issue
Reviewed
Won't Fix
This issue won't be fixed
Status
Abandoned
Somebody has started to work on this but abandoned work
Status
Blocked
Something is blocking this issue or pull request
Status
Need More Info
Feedback is required to reproduce issue or to continue work
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
toasterson/Anima#181
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Implement the anima-qa MCP server with full tool registration and VM lifecycle management.
Background
This is the core server that receives test instructions from OpenClaw agents and translates them into vm-manager operations. Communicates via MCP HTTP protocol (JSON-RPC 2.0).
🔗 Remote Sources (all on code.aopc.cloud)
vm-manager — VM lifecycle management library:
git clone https://code.aopc.cloud/CloudNebulaProject/vm-manager.gitHypervisortrait:prepare(),start(),stop(timeout),destroy(),suspend(),resume(),state(),guest_ip(),console_endpoint()VmSpec,VmHandle,VmState,NetworkConfig,CloudInitConfig,SshConfigQemuBackend::new(qemu_binary, data_dir, default_bridge)— KVM-backed, all asyncRouterHypervisorwith platform-aware backend dispatchImageManager::new()downloads images,create_overlay(base, overlay, size_gb)creates QCOW2 snapshotsConsoleTailer::tail(endpoint, line_tx, stop_rx)streams serial console linescreate_nocloud_iso_raw()generates cloud-init seed ISOsAnima workspace:
git clone https://code.aopc.cloud/toasterson/Anima.git"crates/anima-qa"Design doc: Ask Tecton for
memory/projects/anima-qa.md— full architecture spec🏗️ Implementation Guide
Step 1: Add crate to workspace
Add
"crates/anima-qa"to themembersarray in root Cargo.toml.Cargo.toml for anima-qa:
Step 2: MCP protocol handler
Implement JSON-RPC 2.0 request parsing. 10 tools each with JSON Schema parameter definitions. Error codes: -32700 (parse), -32601 (method not found), -32603 (internal).
Step 3: Action handlers
QaMcpServer struct holds RouterHypervisor, ImageManager, active VM registry.
VM spec for QA: name "qa-{uuid}", image from cache dir, 4 vCPUs, 4GB RAM, 20GB disk, User networking, cloud-init for qa user, SSH, UEFI.
Step 4: HTTP server
axum Router with POST /mcp and GET /health. Bind to 0.0.0.0:8090 (override with QA_MCP_PORT env).
✅ Acceptance Criteria
Related WIs