WIP: Phase 39 — Distributed Inference Fabric (LlmBackend trait + Candle ROCm + reservation) #270
Draft
toasterson
wants to merge 1 commit from
claude/wi-019dc599-phase-39-distributed-inference-fabric-ll into main
pull from: claude/wi-019dc599-phase-39-distributed-inference-fabric-ll
merge into: toasterson:main
toasterson:main
toasterson:claude/wi-019fa8f0-adr-081-s0-pay-the-r2-empirical-bet-prob
toasterson:claude/wi-019f90cc-p26-5-wire-the-neural-bridge-into-the-in
toasterson:claude/wi-019f90cc-p27-2-tripleverbalizer-kg-triples-divers
toasterson:ptah/hip-qwen2-device-gating
toasterson:claude/wi-019fa44f-sessions-on-one-akh-still-serialise-on-t
toasterson:claude/wi-019fff96-periodic-snapshots-have-failed-390-day-s
toasterson:claude/wi-019fe620-dispatch-trap-triage-as-an-agent-tool-po
toasterson:claude/wi-019dd0c5-phase-42b-longmemeval-locomo-harness-wit
toasterson:claude/wi-019f90cb-p26-4-neural-vsa-encoder-project-layer-n
toasterson:claude/wi-019fdd22-the-learn-on-new-triples-trigger-fires-4
toasterson:docs/babysit-lane-skill
toasterson:claude/wi-019f90cb-p26-3-polarquant-kv-cache-compression-in
toasterson:claude/wi-019fa8eb-wi-4-diagnostics-provider-dispatched-bla
toasterson:claude/wi-019fa8f0-librarian-consolidation-is-ungated-unbat
toasterson:claude/wi-019fe636-sleep-relocate-leave-the-akh-advisory-lo
toasterson:claude/wi-019fe260-any-acp-call-against-a-non-resident-work
toasterson:fix/upstream-mcp-initialized
toasterson:fix/librarian-cloud-endpoint
toasterson:feat/curation-tasks
toasterson:feat/wake-on-open-hydration
toasterson:feat/exec-none-backend
toasterson:fix/chart-workspace-seed-initcontainer
toasterson:feat/chart-akh-declarative-config
toasterson:claude/wi-019fe1b4-the-akhomed-image-ships-no-protoc-so-eve
toasterson:feat/local-drop-launchdaemon
toasterson:archive/wi-019fa44f-rebased-onto-main
toasterson:claude/wi-019fdd21-ci-never-builds-the-akh-medu-crate-it-on
toasterson:claude/wi-019fa83d-compile-feedback-lints-the-whole-workspa
toasterson:claude/wi-019fbe82-the-akh-emits-tool-activity-as-prose-in
toasterson:claude/wi-019fbf62-phase-44n-context-rot-curve-bench-per-mo
toasterson:claude/wi-019fcce4-per-turn-dispatch-mode-akh-dispatch-mode
toasterson:agent/e138bd65c5aa
toasterson:claude/wi-019fcd3d-akhomed-on-arm64-should-run-pvc-less-in
toasterson:claude/wi-019fce1e-kg-delete-shipped-with-zero-tests-a-dang
toasterson:claude/wi-019f579f-add-kg-delete-triple-delete-capability-t
toasterson:claude/wi-019e480e-mcp-crud-endpoints-for-agent-goals-expos
toasterson:claude/wi-019fba6a-turn-completion-waits-for-the-sink-refco
toasterson:claude/wi-019fcbb6-wire-remotebackend-into-akhomed-the-48c
toasterson:claude/wi-019dcaac-phase-38i-otlp-tracing-skeleton-first-oo
toasterson:claude/wi-019dcaad-phase-38j-otlp-metrics-seshat-instrument
toasterson:claude/wi-019dcaad-phase-38k-otel-logs-to-alloy-w3c-trace-p
toasterson:archive/2026-08-03-38i-pre-reset
toasterson:claude/wi-019fb9d6-panic-in-the-turn-completion-path-tokio
toasterson:claude/wi-019fba6a-the-agentic-loop-wedges-when-the-model-r
toasterson:claude/wi-019fb9d7-a-turn-can-receive-bytes-for-57-minutes
toasterson:claude/wi-019fb44f-the-watchdog-is-blind-while-the-model-ge
toasterson:claude/wi-019fb44f-a-turn-goes-silent-after-its-work-is-don
toasterson:archive/wi-019fa44f-sessions-on-one-akh-still-serialise-on-t
toasterson:claude/wi-019faa3e-a-reset-upstream-stream-drops-the-turn-i
toasterson:claude/wi-019f85d6-wave-r2-ownership-autostart-owner-host-c
toasterson:claude/wi-019f85d6-wave-w1-ritual-genesis-pantheon-packs-di
toasterson:claude/wi-019f85d7-wave-w2-the-wizard-akh-onboard-verbs-akh
toasterson:claude/wi-019f85d7-wave-w4-render-tier-psyche-render-pipeli
toasterson:claude/wi-019f85d6-wave-r1-config-spine-config-crate-typed
toasterson:archive/2026-07-28-wave-r2-ownership-autostart-owner-host-c
toasterson:archive/2026-07-28-wave-w4-render-tier-psyche-render-pipeli
toasterson:archive/2026-07-28-wave-w2-the-wizard-akh-onboard-verbs-akh
toasterson:archive/2026-07-28-wave-w1-ritual-genesis-pantheon-packs-di
toasterson:archive/2026-08-03-38j-pre-reset
toasterson:claude/wi-019db1bd-anima-integration-workspace-daemon-that
toasterson:archive/2026-08-03-38k-pre-reset
toasterson:claude/wi-019dc57a-replace-continuous-learning-wikipedia-wi
toasterson:claude/adr-094-operating-guidance
toasterson:claude/wi-019dd0c6-phase-42c-drawer-ingest-path-embed-worke
toasterson:claude/wi-019f9f56-sessions-report-the-wrong-work-item-teac
toasterson:claude/agent-sandbox-workspace-root
toasterson:claude/wi-019f9a1e-17-work-items-frozen-since-2026-07-23-ag
toasterson:claude/wi-019f85d6-wave-r4-akh-doctor-read-only-7-sections
toasterson:claude/wi-019f85d7-wave-w3-birth-extras-procedural-avatar-f
toasterson:claude/wi-019f85d6-wave-r3-akhadvertisement-akh-daemon-akhs
toasterson:claude/wi-019f85b9-adversarial-review-distributed-inference
toasterson:claude/wi-019f85ba-adversarial-review-mcp-tools-kg-operatio
toasterson:claude/wi-019f8589-wi-3-session-registry-akh-session-list-i
toasterson:claude/wi-019f8589-wi-2-implement-peer-dispatch-in-delegati
toasterson:claude/wi-019f85b9-adversarial-review-heka-long-term-memory
toasterson:claude/wi-019f85b9-adversarial-review-observability-stack-3
toasterson:claude/wi-019e2501-define-fluent-infrastructure-home-state
toasterson:claude/cool-carson-b63ef4
toasterson:feat/macmini
toasterson:claude/wi-019db054-phase-36-delegation-external-scheduling
toasterson:claude/wi-019db054-phase-32-llm-knowledge-extraction
toasterson:claude/wi-019db054-phase-30-procedural-skills
toasterson:claude/wi-019db054-phase-28-n-akh-semantic-router
toasterson:claude/wi-019db054-phase-24-sensory-grounding
toasterson:claude/wi-019db054-phase-23-affective-system
toasterson:claude/wi-019db054-phase-27-live-kg-llm-training
toasterson:claude/wi-019db054-phase-26-llm-vsa-deep-integration
toasterson:claude/wi-019db054-release-alpha-kubernetes-deployment
toasterson:claude/wi-019e3397-bug-infer-rules-creates-indiscriminate-p
toasterson:claude/wi-019dbc03-bootstrap-embedding-nlu-llm-models-via-o
toasterson:claude/wi-019db054-phase-20-active-inference
toasterson:claude/wi-019dd0c7-phase-42h-cross-tool-bridge-daemon-opena
toasterson:claude/wi-019dd0c6-phase-42g-akhipedia-auto-extraction-from
toasterson:claude/wi-019e5982-akhomed-migrate-from-redb-to-postgres-fo
toasterson:claude/wi-019e481e-mcp-provenance-filter-find-triples-by-de
toasterson:claude/wi-019e481d-bounded-snapshot-mcp-workspace-snapshot
toasterson:claude/wi-019dd122-phase-41i-unified-trace-envelope-joining
toasterson:claude/wi-019dd122-phase-41h-ooda-thinkingloop-integration
toasterson:claude/wi-019dd121-2026-04-28-synthesis-prompt-plan-tool-ca
toasterson:claude/wi-019dd0c6-phase-42f-akh-awakening-per-tool-init-cl
toasterson:claude/wi-019dd0c6-phase-42e-heka-mcp-server-8-tools-rememb
toasterson:claude/wi-019dd0c6-phase-42d-hybrid-retrieval-pgvec-vsa-kg
toasterson:claude/wi-019dd0c5-phase-41-the-thinking-engine-unified-thi
toasterson:claude/wi-019dc9c9-phase-39a-llmbackend-trait-candlelocal-i
toasterson:claude/wi-019dc9c9-phase-38a-workspace-entity-lifecycle-loa
toasterson:claude/wi-019dc614-custom-cnpg-image-bake-with-age-pgvector
toasterson:claude/wi-019dc599-phase-38-relocatable-session-based-akh-w
toasterson:claude/wi-019db054-phase-35-t5-training-infrastructure
toasterson:claude/wi-019db054-phase-34-communicative-intelligence
toasterson:claude/wi-019db054-phase-29-capability-exposure
toasterson:claude/wi-019e26ba-bug-byte-index-panic-on-utf-8-boundary-i
toasterson:claude/wi-019e1598-high-fix-agent-memory-rs-456-byte-index
toasterson:claude/wi-019e3b34-fix-akhomed-llm-integration-for-teacher
toasterson:claude/wi-019e4909-ennead-agents-lack-proper-identity-no-ri
toasterson:claude/wi-019e4909-vsa-symbols-never-grounded-ground-symbol
toasterson:claude/wi-019e3eb9-ground-vsa-symbols-in-tecton-workspace-a
No reviewers
Labels
Clear labels
No items
No labels
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/akh-medu!270
Loading…
Reference in a new issue
No description provided.
Delete branch "claude/wi-019dc599-phase-39-distributed-inference-fabric-ll"
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?
Anima work item
019dc599-ff37-7cf0-b1dc-0ea5d774c20c.Phase 39 — Distributed Inference Fabric
Plan:
docs/ai/plans/2026-04-25-phase39-distributed-inference.mdADR:
docs/ai/decisions/050-distributed-inference-fabric.mdWhat this phase is
Decouples where state lives (Phase 38) from where compute happens. Akh daemons stay where their state is (Talos cluster, M2 in cellar, etc.); LLM and embedding inference can route to any reachable backend with the right capabilities. Backends are pluggable via a
LlmBackendtrait, with implementations for local Candle, remote Candle, and OpenRouter as the primary three. Anthropic ships as an optional/conditional fallback — kept if convenient, dropped if it causes maintenance load. Scarce on-demand backends (the 7900 XTX desktop) use a reservation protocol so multiple Akhs don't trample each other.No native C++ in the stack — Candle hosts everything, including the ROCm path. Performance maturity is traded for a unified Rust toolchain and tight integration with the Phase 26d neural→VSA bridge (which needs hidden-state extraction Candle gives us).
LlmBackendtraitPrimary backends
CandleLocalCandleRemoteOpenRouterConditional / optional backends
AnthropicHailo-8 / Coral on RPi are NOT in scope here — they fit Phase 14 (NLU) / Phase 33 (T5 NLG) embedding workloads, not LLM serving.
Candle on ROCm
This is the hard deliverable. Candle's ROCm support today is experimental. Plan:
candle-coreagainst the AMD HIP / ROCm toolchain on the 7900 XTX desktopReservation protocol
For scarce on-demand backends (7900 XTX desktop, M2 when its homing Akh is busy):
Per-backend policy decides:
CandleLocal → CandleRemote → OpenRouter(with Anthropic appended only when present)Latency-aware routing in Phase 28
The
n akhsemantic router already learns which backend handles which query type best. Phase 39 extends the bandit's context with:Net effect: the router naturally avoids reserved/expensive backends for queries that don't need them.
Discovery + health
Cost tracking
Per-Akh global budget. Single number: cents/day across all paid backends. When the budget is exhausted, the router stops considering paid backends entirely until the next budget window. No per-archetype overrides — that's over-engineered for now; revisit only if a specific archetype is identified that needs paid inference and isn't covered by routing decisions.
Key deliverables
LlmBackendtrait + three primary implementations (CandleLocal,CandleRemote,OpenRouter)Dependencies
n akhsemantic router) — extends with backend-aware routingWhy this priority
Without Phase 39, the 7900 XTX desktop sits unused and Akhs are stuck with whatever inference the host can do locally. With Phase 39, M2-class hosts can route heavy lifting to the desktop on demand, OpenRouter handles cheap distillation jobs, and the cluster Akh has a full fall-through chain.
Resolutions log
2026-04-25
Open questions still standing
- Hidden-state extraction over the wire (CandleRemote): how to keep Phase 26d neural-bridge invariants when hidden states travel via gRPC. Wire format design.
- Reservation semantics under contention: queue vs hard fail vs cost-aware preemption.
- Per-Akh global budget enforcement: cents/day budget threshold definition + reset cadence + alert on near-exhaustion.
2026-06-04 21:20 UTCSummary
This phase introduces a distributed inference fabric by decoupling compute from state, allowing the agent to route LLM workloads dynamically across local Candle (ROCm/CPU), remote Candle, and OpenRouter backends. It adds stateful reservations for scarce hardware, latency/cost-aware routing, and global budget enforcement for paid inference.
Approach
Define the
LlmBackendtrait incrates/anima-aiexposing capabilities, health, lease reservation, and inference/streaming execution. Implement the trait forCandleLocal(leveraging Candle's ROCm features with a fallback to native CPU execution),CandleRemote(via a new gRPC service defined inproto/anima/v1/inference.protosupporting streaming and hidden-state extraction),OpenRouter(REST, with cost-tracking), and a conditionalAnthropicadapter. Introduce aBackendRouterto manage the fall-through chain (CandleLocal->CandleRemote->OpenRouter), enforce the strict cents/day global budget, and handle lease states. Extend the existing semantic router inanima-aito ingest rolling p95 latency, availability, and cost data to make backend routing decisions, and wire these components into theanima-agentdaemon startup.Files likely to change
crates/anima-ai/Cargo.tomlcrates/anima-ai/src/backend/mod.rs[Guess: new module for LlmBackend trait]crates/anima-ai/src/backend/candle_local.rs[Guess]crates/anima-ai/src/backend/candle_remote.rs[Guess]crates/anima-ai/src/backend/openrouter.rs[Guess]crates/anima-ai/src/backend/anthropic.rs[Guess: optional]crates/anima-ai/src/router/backend_router.rs[Guess: reservation lease and fall-through logic]crates/anima-ai/src/router/semantic.rs[Guess: extending the existing router for latencies/costs]proto/anima/v1/inference.proto[Guess: new protobuf file for remote Candle backends]crates/anima-proto/src/lib.rscrates/anima-agent/Cargo.tomlcrates/anima-agent/src/main.rs[Guess: daemon wiring for discovery and configs]Open questions
CandleRemoteefficiently without breaking Phase 26d neural-bridge invariants or imposing excessive network overhead?anima-agentprocess, gracefully falling back to CPU?anima-agentdaemon restarts?Complexity
L: Implementing multiple backend adapters, handling distributed state through leases/health-checks, and integrating the highly experimental Candle ROCm toolchain (complete with CPU fallbacks and profiling) will require significant effort and cross-machine testing.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.