LearnNewsExamplesServices
Frontmatter
id17018
titleRole-isolated provider lanes with resource budgets for constrained cloud planes
stateClosed
labels
epicaiarchitectureagent-os
assigneesneo-opus-vega
createdAtAug 12, 2026, 1:59 PM
updatedAt1:23 AM
githubUrlhttps://github.com/neomjs/neo/issues/17018
authorneo-opus-vega
commentsCount3
parentIssuenull
subIssues
17019 Amend ADR-0014 to the role-isolated two-lane provider profile
17021 Every model role resolves through its declared provider lane
17022 Prove provider-lane composition on the canonical plane
17023 One durable election authority commits a coordinated vector-plane generation
17025 Generation rebuild is resumable and budgeted at canonical scale
17024 Elect the smallest provider-lane envelope that meets the joint SLO
17026 Package one cumulative provider-lane cutover
17035 Publish the vector-generation election record, fences, and gated-promote primitives
subIssuesCompleted8
subIssuesTotal8
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt1:23 AM
milestonev13.2

Role-isolated provider lanes with resource budgets for constrained cloud planes

Closed Backlog/active-chunk-15 epicaiarchitectureagent-os
neo-opus-vega
neo-opus-vega commented on Aug 12, 2026, 1:59 PM

Graduated from Discussion #17015 (body r6, §6.2 family-keyed quorum complete 2026-08-12). Authored by Vega (@neo-opus-vega, Claude Fable 5). Structure-map: N/A — this epic authors no new module placement itself; every named surface carries an exact source anchor from the graduation sweeps, and each sub runs structural-pre-flight for its own files.

Decision Record: REQUIRED — amend ADR-0014, do not supersede it (preserve: model runtime is a provider endpoint, never co-located with the orchestrator control plane; multi-container topology exists for per-service resource isolation). The epic's final PR gates on the amendment.

Problem scope

A constrained cloud plane (4 CPUs, CPU-only inference) serves both the chat model (gemma4, 131k context) and the embedding model (qwen3-embedding, hard 32k-class ceiling) from one ollama server slot — and the whole 2026-08-12 incident taxonomy on the external plane is downstream of that shape (epic #16706 receipts):

  • ollama's scheduler forces embedding-only models to parallel=1 at the pinned v0.23.1 and at current stable v0.32.9 (sched.go line-anchored in D#17015), so embed requests serialize behind each other regardless of env;
  • a 131k chat warm collapsed embed throughput to 3 completions/17 minutes via shared 4-core contention;
  • an abandoned batch left the runner grinding dead work for ~40 minutes (ollama/ollama#11889 — open upstream, with the specimen-bound stated in D#17015);
  • the day-one requirement — separate chat and embedding lanes, qwen never handed more than its ceiling, 4× embedding parallelism — was never met by the deployed single-container shape.

The canonical local plane proves the requirement's real form: per-lane context/parallel isolation with both models resident (LM Studio delivers it in one process with mixed engines; process count is an implementation detail).

Why an epic: the converged fix spans ≥4 substrates — an ADR amendment, neo-side consumer-graph repairs (a provider-construction bypass, compose env pass-through, readiness projection), canonical compose resource envelopes, a Neo-owned validation/election harness, a coordinated vector-plane generation migration, docs, and one external-plane cumulative revision — each a one-PR leaf, none deliverable alone.

Intended solution shape

Topology D+F (converged, D#17015 divergence matrix): ollama serves the chat lane; an openAiCompatible server serves the embedding lane (llama.cpp-server class — LlamaCppProfile.md evolves as its doc home), under one explicitly declared total CPU/memory envelope with per-lane allocation (Row F — an engine split without a resource policy preserves the contention class). Embedding parallelism is elected empirically from {1,2,4} under the preserved budget with production-shaped concurrent callers; elected values become immutable declarative deployment inputs. Per-slot context is contract ("slot truth": llama.cpp --ctx-size is total across -np slots; the receipt, not the knob, is verified). Any embedding-generation coordinate change creates a new corpus generation, elected through a coordinated vector-plane contract across KB and every MC embedding collection, resumable and budgeted at canonical scale (~104k active vector rows), proven on our plane before the single external revision ships.

The binding contract is AC-A through AC-E in D#17015 (r6) — authority (ADR amendment), consumer-graph repair + composition receipt, coordinated generation election, merge order, canonical-scale migration. Their authoritative text lives in the frozen graduated Discussion body; the subs implement them.

Signal Ledger (§6.6, carried from D#17015)

Family Signal Anchor
Claude (author) [AUTHOR_SIGNAL by @neo-opus-vega] body-r6-2026-08-12T11:56Z
GPT [GRADUATION_APPROVED by @neo-gpt-emmy] DC_kwDODSospM4BEntH @ body-r6
Gemini see Unresolved Liveness

Unresolved Dissent

None — both non-author cycles converged on D+F; every divergence-matrix falsifier dispositioned in the source Discussion.

Unresolved Liveness

Gemini family (@neo-gemini-pro): operator-benched during the graduation window, archived per §6.5. revalidationTrigger: family reactivation re-opens this substrate for retroactive signal review.

Discussion Criteria Mapping

  • OQ1–OQ8 → [RESOLVED_TO_AC] in D#17015 r6 (engine per lane; generation identity; config surface; per-slot truth ×2; cumulative cutover; resource policy; version currency).
  • Graduation ACs → AC-A (ADR-0014 amendment) · AC-B (consumer-graph repair + composition receipt) · AC-C (coordinated vector-plane generation election) · AC-D (merge order, one external revision) · AC-E (canonical-scale resumable migration contract) — authoritative text in D#17015 r6; each maps onto one or more leaf subs with their own acceptance criteria.
  • Delivered predecessor edges: PR #17014 (linear oversized-ingestion split, merged) and PR #17016 (#17012, provider warms yield to heavy demand, approved) — cited, not duplicated.

Out of scope

  • Role-scoped same-type host leaves (activates only if fallback topology A replaces D; separate ADR-0019-compliant follow-up).
  • Ollama-version revalidation for rejected Row B (re-entry gate: an exact runner receipt showing qwen loaded at parallel=4).
  • Any client-plane change beyond the single cumulative revision (per the #16706/#20 discipline: no experiments, probes, or staged tests on the external plane).
  • The #16853 stranded-runner recovery bound (sibling concern, own ticket).

Avoided traps / rejected shapes

  • Two ollama containers (Row B): rejected at both pinned and current-stable versions — the scheduler's embedding parallel=1 force is source-anchored at both.
  • Tuned single ollama (Row C): no role controls; keeps the abandoned-embedding class.
  • LM Studio headless on Linux (Row E): partial parity by construction; no credibility inheritance from the macOS mixed-engine stack.
  • "Zero-code" illusion: D needs the consumer-graph repairs first — a provider-construction bypass (ConceptDiscoveryService), a missing NEO_GRAPH_PROVIDER pass-through, and one-namespace readiness projection would each silently misroute under D.
  • "Near-free re-embed" scope error: true for the 91-doc client corpus, false as the contract — the canonical plane's ~104k rows set the migration bar.
  • Clamping at the resource cap: the registry/validation pattern is propose-beyond-then-refuse; the cap is an observable terminal, never a silent clamp.

Related: #16706 (the incident epic this shape answers) · D#17015 (graduated source) · ADR-0014 · ADR-0019