feat: harden node placement and partial model loading

This commit is contained in:
Dobromir Popov
2026-07-13 21:58:08 +02:00
parent a6bcc69288
commit 5d87e81bc9
21 changed files with 497 additions and 55 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "Distributed Inference Network",
"description": "Distributed inference network: base program US-001…US-035 complete; post-alpha friends-test and LAN-serving arc US-036…US-047 tracked here. Active scratch features (alpha hardening, NCA, distributed GGUF) have separate prd.json files under .scratch/.",
"description": "Distributed inference network: base program US-001…US-035 complete; friends-test arc US-036…US-049; capacity/placement US-048/050. Scratch features (alpha hardening AH-001…AH-025, NCA, distributed GGUF, Qwen demand) have separate prd.json files under .scratch/.",
"branchName": "ralph/distributed-inference-network",
"userStories": [
{
@@ -851,11 +851,12 @@
"python -m pytest passes from repo root"
],
"priority": 37,
"status": "open",
"status": "done",
"notes": "Source issue: docs/issues/37-relay-bridge-concurrency.md. Critical for public friends-test; blocks concurrent head + hop on same node.",
"dependsOn": [
"US-036"
]
],
"completionNotes": "ThreadPoolExecutor dispatch in relay_bridge.py; per-frame WS send lock; test_relay_bridge_serves_concurrent_requests; --relay-concurrency CLI flag sets MESHNET_RELAY_CONCURRENCY."
},
{
"id": "US-038",
@@ -890,12 +891,13 @@
"python -m pytest passes from repo root"
],
"priority": 39,
"status": "open",
"status": "done",
"notes": "Source issue: docs/issues/39-caller-credit-account-keys.md. Critical for friends-test inference.",
"dependsOn": [
"US-031",
"US-035"
]
],
"completionNotes": "Caller credit granted once per account on first API key via deterministic event id; tests/test_accounts.py covers grant, revoke, and invented-bearer rejection."
},
{
"id": "US-040",
@@ -908,11 +910,12 @@
"python -m pytest passes from repo root"
],
"priority": 40,
"status": "open",
"status": "done",
"notes": "Source issue: docs/issues/40-devnet-dashboard-topup.md. Mainnet deployments set --devnet-topup 0.",
"dependsOn": [
"US-039"
]
],
"completionNotes": "POST /v1/account/topup with session auth and flag gating; tests/test_accounts.py covers flag off/on, own-account credit, and cross-account 403."
},
{
"id": "US-041",
@@ -946,7 +949,7 @@
],
"priority": 42,
"status": "in-design",
"notes": "Source issue: docs/issues/42-gguf-llamacpp-node-backend.md. Distributed native path: ADR-0024. Sequencing: phase C before A/B investigation.",
"notes": "Source issue: docs/issues/42-gguf-llamacpp-node-backend.md. Phase C before ADR-0024 distributed worker; see runtime sequencing in issue file.",
"dependsOn": [
"US-036"
]
@@ -984,12 +987,12 @@
],
"priority": 44,
"status": "in-progress",
"notes": "Source issue: docs/issues/44-tracker-shard-source-partial-download.md. Download path largely implemented 2026-07-06; partial LOAD (meta-device materialization) and two-machine acceptance remain.",
"notes": "Source issue: docs/issues/44-tracker-shard-source-partial-download.md. Download path and partial LOAD implemented; live two-machine LAN verification remains.",
"dependsOn": [
"US-004",
"US-012"
],
"completionNotes": "Tracker models-dir indexing, layer-scoped tar stream, HF allow_patterns client-side from remote index, per-file download API with retries, symlink dereference in tar writers. Remaining: true partial model load and live two-machine verification."
"completionNotes": "Tracker models-dir indexing, layer-scoped tar stream, HF allow_patterns client-side from remote index, per-file download API with retries, symlink dereference in tar writers. Partial LOAD via init_empty_weights + layer-scoped safetensors materialization; memory-scaling and checksum fallback tests pass. Remaining: live two-machine test (machine B receives only assigned files from A, no HF)."
},
{
"id": "US-045",
@@ -1072,10 +1075,46 @@
"US-033",
"US-039"
]
},
{
"id": "US-048",
"title": "48 — Memory budget, shard slots, and dropout relocation hardening",
"description": "Harden the capacity contract around US-013 coverage-first assignment: enforce memory budget and max_loaded_shards in rebalance/dropout relocation, and decide whether one node may host multiple concurrent shard backends or max_loaded_shards remains metadata until runtime support lands.",
"acceptanceCriteria": [
"Assignment/rebalance never exceeds memory budget or max_loaded_shards",
"Dropout test restores full coverage without violating capacity limits",
"CLI --memory and --max-shards reflected in registration payload",
"python -m pytest tests/test_tracker_routing.py tests/test_node_startup.py passes"
],
"priority": 48,
"status": "open",
"notes": "Source issue: docs/issues/48-memory-budget-shard-slots-and-dropout-relocation.md. Renumbered from duplicate slot 20. Enables spare shard slots for ADR-0026 managed placement.",
"dependsOn": [
"US-013"
]
},
{
"id": "US-050",
"title": "50 — Qwen3.6-27B demand-driven managed placement",
"description": "Offer pinned Qwen/Qwen3.6-27B as a recommended text-only chat model. Valid chat requests prove demand; when spare fleet capacity exists, the tracker assigns managed nodes to reach complete coverage. Pinned startup assignments remain immutable per ADR-0026; NCA admission required before routable.",
"acceptanceCriteria": [
"First valid request for an uncovered variant queues demand and returns 503 model_loading until complete validated coverage exists",
"Managed assignments use only spare capacity and carry managed: true",
"Pinned startup assignments are never silently retargeted",
"Optional quantization field (bfloat16/int8/nf4) with coverage-vote UI semantics per scratch PRD",
"python -m pytest passes from repo root"
],
"priority": 50,
"status": "in-design",
"notes": "Source: .scratch/qwen3.6-27b-demand-placement/PRD.md and docs/issues/50-qwen3.6-27b-demand-placement.md. Reconciled with ADR-0026 and ADR-0023.",
"dependsOn": [
"US-035",
"US-048"
]
}
],
"metadata": {
"updatedAt": "2026-07-13T16:40:00.000Z",
"updatedAt": "2026-07-13T17:00:00.000Z",
"statusVocabulary": {
"open": "Not started",
"in-design": "Decisions pending before implementation can begin",