@miller-tech/uap 2.11.0 → 2.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/config/capacity-policy.json +15 -3
- package/config/model-profiles/qwen38.json +42 -34
- package/dist/.tsbuildinfo +1 -1
- package/dist/bin/cli.js +39 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/capacity/policy.d.ts +15 -0
- package/dist/capacity/policy.d.ts.map +1 -1
- package/dist/capacity/policy.js +23 -0
- package/dist/capacity/policy.js.map +1 -1
- package/dist/capacity/probe.d.ts.map +1 -1
- package/dist/capacity/probe.js +6 -1
- package/dist/capacity/probe.js.map +1 -1
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +148 -2
- package/dist/cli/deliver.js.map +1 -1
- package/dist/cli/inference.d.ts +13 -0
- package/dist/cli/inference.d.ts.map +1 -0
- package/dist/cli/inference.js +132 -0
- package/dist/cli/inference.js.map +1 -0
- package/dist/cli/loops.d.ts +39 -0
- package/dist/cli/loops.d.ts.map +1 -0
- package/dist/cli/loops.js +154 -0
- package/dist/cli/loops.js.map +1 -0
- package/dist/cli/wizard-config.d.ts.map +1 -1
- package/dist/cli/wizard-config.js +5 -1
- package/dist/cli/wizard-config.js.map +1 -1
- package/dist/cli/worktree.d.ts.map +1 -1
- package/dist/cli/worktree.js +8 -4
- package/dist/cli/worktree.js.map +1 -1
- package/dist/delivery/adversarial-attack.d.ts +99 -0
- package/dist/delivery/adversarial-attack.d.ts.map +1 -0
- package/dist/delivery/adversarial-attack.js +326 -0
- package/dist/delivery/adversarial-attack.js.map +1 -0
- package/dist/delivery/adversarial-gate.d.ts +120 -0
- package/dist/delivery/adversarial-gate.d.ts.map +1 -0
- package/dist/delivery/adversarial-gate.js +259 -0
- package/dist/delivery/adversarial-gate.js.map +1 -0
- package/dist/delivery/adversarial-sanction.d.ts +52 -0
- package/dist/delivery/adversarial-sanction.d.ts.map +1 -0
- package/dist/delivery/adversarial-sanction.js +134 -0
- package/dist/delivery/adversarial-sanction.js.map +1 -0
- package/dist/delivery/agentic-executor.d.ts +69 -22
- package/dist/delivery/agentic-executor.d.ts.map +1 -1
- package/dist/delivery/agentic-executor.js +152 -8
- package/dist/delivery/agentic-executor.js.map +1 -1
- package/dist/delivery/applier.d.ts +8 -0
- package/dist/delivery/applier.d.ts.map +1 -1
- package/dist/delivery/applier.js +3 -1
- package/dist/delivery/applier.js.map +1 -1
- package/dist/delivery/convergence-loop.d.ts +15 -0
- package/dist/delivery/convergence-loop.d.ts.map +1 -1
- package/dist/delivery/convergence-loop.js.map +1 -1
- package/dist/delivery/criteria-lint.d.ts +74 -0
- package/dist/delivery/criteria-lint.d.ts.map +1 -0
- package/dist/delivery/criteria-lint.js +134 -0
- package/dist/delivery/criteria-lint.js.map +1 -0
- package/dist/delivery/deliver-toggle.d.ts +21 -0
- package/dist/delivery/deliver-toggle.d.ts.map +1 -0
- package/dist/delivery/deliver-toggle.js +40 -0
- package/dist/delivery/deliver-toggle.js.map +1 -0
- package/dist/delivery/delivery-evidence.d.ts +109 -0
- package/dist/delivery/delivery-evidence.d.ts.map +1 -0
- package/dist/delivery/delivery-evidence.js +139 -0
- package/dist/delivery/delivery-evidence.js.map +1 -0
- package/dist/delivery/epic-mission.d.ts +5 -1
- package/dist/delivery/epic-mission.d.ts.map +1 -1
- package/dist/delivery/epic-mission.js +34 -6
- package/dist/delivery/epic-mission.js.map +1 -1
- package/dist/delivery/execution-gate.d.ts.map +1 -1
- package/dist/delivery/execution-gate.js +90 -7
- package/dist/delivery/execution-gate.js.map +1 -1
- package/dist/delivery/index.d.ts +9 -1
- package/dist/delivery/index.d.ts.map +1 -1
- package/dist/delivery/index.js +9 -1
- package/dist/delivery/index.js.map +1 -1
- package/dist/delivery/journey-depth.d.ts +61 -0
- package/dist/delivery/journey-depth.d.ts.map +1 -0
- package/dist/delivery/journey-depth.js +91 -0
- package/dist/delivery/journey-depth.js.map +1 -0
- package/dist/delivery/master-pipeline.d.ts +50 -0
- package/dist/delivery/master-pipeline.d.ts.map +1 -0
- package/dist/delivery/master-pipeline.js +52 -0
- package/dist/delivery/master-pipeline.js.map +1 -0
- package/dist/delivery/mission-acceptance.d.ts.map +1 -1
- package/dist/delivery/mission-acceptance.js +54 -2
- package/dist/delivery/mission-acceptance.js.map +1 -1
- package/dist/delivery/orchestrated-mission.d.ts +4 -1
- package/dist/delivery/orchestrated-mission.d.ts.map +1 -1
- package/dist/delivery/orchestrated-mission.js +18 -9
- package/dist/delivery/orchestrated-mission.js.map +1 -1
- package/dist/delivery/plan-check.d.ts +1 -0
- package/dist/delivery/plan-check.d.ts.map +1 -1
- package/dist/delivery/plan-check.js +48 -0
- package/dist/delivery/plan-check.js.map +1 -1
- package/dist/delivery/task-orchestrator.d.ts +16 -9
- package/dist/delivery/task-orchestrator.d.ts.map +1 -1
- package/dist/delivery/task-orchestrator.js +4 -2
- package/dist/delivery/task-orchestrator.js.map +1 -1
- package/dist/delivery/task-workspace.d.ts +35 -5
- package/dist/delivery/task-workspace.d.ts.map +1 -1
- package/dist/delivery/task-workspace.js +53 -7
- package/dist/delivery/task-workspace.js.map +1 -1
- package/dist/delivery/test-oracle-additive.d.ts +26 -6
- package/dist/delivery/test-oracle-additive.d.ts.map +1 -1
- package/dist/delivery/test-oracle-additive.js +40 -15
- package/dist/delivery/test-oracle-additive.js.map +1 -1
- package/dist/delivery/user-validation.d.ts +14 -0
- package/dist/delivery/user-validation.d.ts.map +1 -1
- package/dist/delivery/user-validation.js +103 -9
- package/dist/delivery/user-validation.js.map +1 -1
- package/dist/delivery/verifier-ladder.d.ts.map +1 -1
- package/dist/delivery/verifier-ladder.js +24 -6
- package/dist/delivery/verifier-ladder.js.map +1 -1
- package/dist/inference/analysis.d.ts +138 -0
- package/dist/inference/analysis.d.ts.map +1 -0
- package/dist/inference/analysis.js +243 -0
- package/dist/inference/analysis.js.map +1 -0
- package/dist/inference/probe.d.ts +85 -0
- package/dist/inference/probe.d.ts.map +1 -0
- package/dist/inference/probe.js +403 -0
- package/dist/inference/probe.js.map +1 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js +45 -18
- package/dist/models/types.js.map +1 -1
- package/dist/self-tuning/profiles/qwen38.d.ts +17 -8
- package/dist/self-tuning/profiles/qwen38.d.ts.map +1 -1
- package/dist/self-tuning/profiles/qwen38.js +21 -11
- package/dist/self-tuning/profiles/qwen38.js.map +1 -1
- package/dist/utils/model-slots.d.ts +11 -5
- package/dist/utils/model-slots.d.ts.map +1 -1
- package/dist/utils/model-slots.js +11 -5
- package/dist/utils/model-slots.js.map +1 -1
- package/docs/INDEX.md +7 -1
- package/docs/guides/CAPACITY_POLICY.md +29 -4
- package/docs/guides/INFERENCE_HEALTH.md +184 -0
- package/docs/guides/PROXY.md +1 -0
- package/docs/guides/QWEN38_EXL3.md +268 -0
- package/docs/plans/hlg-master-architecture-uplift-2026-09-24.md +67 -0
- package/docs/plans/system1-uplift-2026-09-18.md +1 -2
- package/docs/reference/CONFIGURATION.md +10 -1
- package/docs/reference/CONFIGURATION_REFERENCE.md +14 -0
- package/docs/reference/automode-risk.md +1 -1
- package/docs/reference/evidence-bound-ship.md +3 -2
- package/docs/reference/semantic-supervisor.md +3 -3
- package/docs/reference/system1-classifier.md +4 -4
- package/package.json +2 -2
- package/scripts/lib/llama-upstream.sh +7 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/src/policies/enforcers/__pycache__/expert_review_required.cpython-312.pyc +0 -0
- package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-312.pyc +0 -0
- package/src/policies/enforcers/expert_review_required.py +1 -4
- package/templates/hooks/__pycache__/deliver_autoroute.cpython-312.pyc +0 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/tools/agents/scripts/anthropic_proxy.py +374 -16
- package/tools/agents/scripts/confidence_escalation.py +4 -2
- package/tools/agents/scripts/project_telemetry.py +1 -0
- package/tools/agents/scripts/tool_risk.py +1 -0
- package/tools/agents/scripts/tool_risk_calibrate.py +1 -0
- package/tools/agents/scripts/toolcall_path_normalizer.py +1 -0
- package/tools/agents/tests/test_anthropic_proxy_streaming.py +52 -1
- package/tools/agents/tests/test_confidence_escalation.py +3 -2
- package/tools/agents/tests/test_count_tokens_scale_per_session.py +126 -0
- package/tools/agents/tests/test_expert_review_pr_scope.py +10 -11
- package/tools/agents/tests/test_lockstep_escalation.py +324 -0
- package/tools/agents/tests/test_thinking_template_kwargs.py +10 -4
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
[](#testing)
|
|
10
10
|
[](LICENSE)
|
|
11
11
|
|
|
12
|
-
`
|
|
12
|
+
`v2.11.0` · 367 TypeScript modules across 26 subsystems · 459 vitest suites (+ a ~1,200-test Python enforcer/proxy suite) · 9 agent harnesses
|
|
13
13
|
|
|
14
14
|
[Quickstart](#quickstart) · [Why UAP?](#why-uap) · [The delivery pipeline](docs/guides/DELIVERY_PIPELINE.md) · [`uap deliver`](#the-deliver-harness) · [Docs](docs/INDEX.md)
|
|
15
15
|
|
|
@@ -110,17 +110,18 @@ UAP installs hooks into your agent harness, then mediates every tool call throug
|
|
|
110
110
|
▼
|
|
111
111
|
┌─────────────────────────────────────────────────────────────┐
|
|
112
112
|
│ UAP CLI (uap) │
|
|
113
|
-
│ setup · memory · deliver · verify · worktree ·
|
|
114
|
-
│ quality · plan · fidelity · interaction · task ·
|
|
115
|
-
│ droids · model · mcp-router · proxy ·
|
|
116
|
-
│ self-harness · tune · design · principles ·
|
|
113
|
+
│ setup · memory · deliver · verify · review · worktree · │
|
|
114
|
+
│ policy · quality · plan · fidelity · interaction · task · │
|
|
115
|
+
│ coord · droids · model · mcp-router · proxy · supervise · │
|
|
116
|
+
│ orchestrator · self-harness · tune · design · principles · │
|
|
117
|
+
│ bench · doctor · classify … │
|
|
117
118
|
└──┬─────────┬──────────┬──────────┬──────────┬───────────────┘
|
|
118
119
|
▼ ▼ ▼ ▼ ▼
|
|
119
120
|
Memory Policy MCP Router Delivery Coordination
|
|
120
121
|
4 tiers 32 gates compression + verify + deploy batch
|
|
121
122
|
```
|
|
122
123
|
|
|
123
|
-
- **60 CLI commands** across 26 source subsystems (367 TypeScript modules).
|
|
124
|
+
- **60+ CLI commands** across 26 source subsystems (367 TypeScript modules).
|
|
124
125
|
- Deep dive: **[docs/architecture/OVERVIEW.md](docs/architecture/OVERVIEW.md)** · protocol spec: **[docs/architecture/PROTOCOL.md](docs/architecture/PROTOCOL.md)**.
|
|
125
126
|
|
|
126
127
|
---
|
|
@@ -3,10 +3,19 @@
|
|
|
3
3
|
"services": [
|
|
4
4
|
{
|
|
5
5
|
"name": "gsq-rco-server",
|
|
6
|
-
"systemd": {
|
|
6
|
+
"systemd": {
|
|
7
|
+
"unit": "uap-gsq-rco-server.service",
|
|
8
|
+
"scope": "user"
|
|
9
|
+
},
|
|
7
10
|
"budget": {
|
|
8
11
|
"vramMiB": 5120,
|
|
9
|
-
"note": "--vbr-vram 5120M, -c 229376, -np
|
|
12
|
+
"note": "--vbr-vram 5120M, -c 229376, -np 2, -ub 1024, --cache-ram 32768. OOM fix rounds 1-2 (2026-09-18: four SIGABRTs from KV-budget overcommit on the 24 GiB 3090); 2026-09-20: two rails restored over the SAME 229376 pool (--kv-unified makes it shared, not per-rail) and --cache-ram raised 16384->32768 since two rails share the host prompt cache.",
|
|
13
|
+
"execStartMustContain": [
|
|
14
|
+
"-c 229376",
|
|
15
|
+
"-np 2",
|
|
16
|
+
"--vbr-vram 5120M",
|
|
17
|
+
"--cache-ram 32768"
|
|
18
|
+
]
|
|
10
19
|
},
|
|
11
20
|
"headroom": {
|
|
12
21
|
"gpuMinFreeMiB": 600
|
|
@@ -18,7 +27,10 @@
|
|
|
18
27
|
},
|
|
19
28
|
{
|
|
20
29
|
"name": "gsq-monitor",
|
|
21
|
-
"systemd": {
|
|
30
|
+
"systemd": {
|
|
31
|
+
"unit": "uap-gsq-monitor.service",
|
|
32
|
+
"scope": "user"
|
|
33
|
+
},
|
|
22
34
|
"budget": {
|
|
23
35
|
"rssMiB": 256,
|
|
24
36
|
"note": "watchdog for the gsq-rco server; created 2026-09-18"
|
|
@@ -1,70 +1,78 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_profile": "qwen38",
|
|
3
|
-
"_description": "Qwen3.8 27B — local
|
|
4
|
-
"_engine": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
"max_tokens":
|
|
8
|
-
"_max_tokens_comment": "Deliberately generous
|
|
9
|
-
|
|
3
|
+
"_description": "Qwen3.8 27B GSQ-RCO — local llama.cpp (buun fork) deployment for agentic tool-calling workloads. Successor to qwen36; the default local executor in UAP routing. Routes through the anthropic-proxy for the tool/finalize guardrails, NOT the inference server directly.",
|
|
4
|
+
"_engine": "buun-llama-cpp b1261-ed67e11b8 (llama.cpp fork) via uap-gsq-rco-server.service on :8080. Serves /props, /slots, /metrics and /v1. Weights: Qwen3.8-27B-GSQ-RCO-IQ3_S.gguf (ISTA-DASLab non-uniform 3.50 bpw, 10.96 GiB) + mmproj-Qwen3.8-27B-BF16.gguf (vision/video) + Qwen3.8-27B-DFlash2-Q4_K_M.gguf draft.",
|
|
5
|
+
"_engine_history": "CORRECTED 2026-09-20. This profile previously described ninfer-serve and asserted that /props, /slots and /metrics did not exist and that chat_template_kwargs was rejected with HTTP 400. That backend is not what is running; all three endpoints are live. Verify against /props before trusting engine claims here.",
|
|
6
|
+
"model": "qwen38-gsq-rco-27b",
|
|
7
|
+
"max_tokens": 57344,
|
|
8
|
+
"_max_tokens_comment": "Deliberately generous: 50% of the 114688 window, the same ratio the previous 65536/131072 pairing used. The engine returns chain-of-thought in a SEPARATE reasoning_content field (--reasoning-format auto), so reasoning spends completion budget without ever appearing in content. A tight cap therefore does not produce a short answer, it produces an EMPTY one with finish_reason=length — measured previously as ~90% first-turn decode failure that read as bad output format and was really budget truncation. Do not lower this without re-measuring decode compliance.",
|
|
10
9
|
"temperature": 0.3,
|
|
11
10
|
"top_p": 0.9,
|
|
12
11
|
"top_k": 20,
|
|
13
12
|
"min_p": 0.05,
|
|
14
13
|
"repetition_penalty": 1.0,
|
|
15
|
-
"_sampling_comment": "Carried over from qwen36 unchanged: these are UAP's tool-call-tuned values, not the vendor's chat defaults, and nothing has been re-measured on 3.8
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
"_sampling_comment": "Carried over from qwen36 unchanged: these are UAP's tool-call-tuned values, not the vendor's chat defaults, and nothing has been re-measured on 3.8. They deliberately differ from the server's own defaults (temp 0.7 / top_p 0.95 / top_k 20 / min_p 0, plus DRY 0.8 allowed_length 16). Left untouched on 2026-09-20 because the 2-rail work measured throughput, not output quality. Re-tune with `uap tune` before changing them.",
|
|
15
|
+
"stop_sequences": [
|
|
16
|
+
"<|im_end|>"
|
|
17
|
+
],
|
|
18
18
|
"timeout_ms": 300000,
|
|
19
|
-
"context_window":
|
|
19
|
+
"context_window": 114688,
|
|
20
|
+
"_context_window_comment": "THIS IS A PER-SESSION CAP, AND IT IS LOAD-BEARING (set 2026-09-20). The server runs -np 2 -c 229376 with kv_unified=true, which means 229376 is ONE SHARED POOL, not a per-rail allowance: /slots reports n_ctx=229376 for BOTH slots and each rail may address the whole pool. The proxy's own detection (anthropic_proxy.py _maybe_recheck_context_window) reads slots[0].n_ctx and overrides the PROXY_CONTEXT_WINDOW env pin, so without a profile every session would be told it owns 229376 — two concurrent sessions would then demand 458752 cells from a 229376-cell pool and thrash the prefix cache. A profile context_window is the mechanism that applies a per-session cap (anthropic_proxy.py:13933). It is not the only writer of monitor.context_window — :3245 sweeps every live monitor whenever upstream n_ctx changes — but the recheck runs BEFORE the profile override on each request (:13893), so the cap is restored on the next call rather than lost. 114688 x 2 rails = exactly the pool. In practice sessions sit far below it: the proxy prunes at 0.70 (~80k) toward 0.50 (~57k). IMPORTANT GAP: this cap is OPT-IN. _resolve_profile_name returns None when no x-uap-model-profile header (or uap_model_profile body param) is present, and there is no default-profile setting, so a client that does not send it gets the full shared pool. opencode, codex and claude-local are configured to send it; factory/droid custom models have no header field and CANNOT, so keep factory to one local session at a time. Note also that /v1/models advertises the process-wide window (229376), not this cap — a client that sizes itself from discovery rather than its own config will still aim at the pool.",
|
|
20
21
|
"optimize_for_tool_calls": true,
|
|
21
22
|
"mode_switch_buffer_tokens": 500,
|
|
22
23
|
"enable_thinking": true,
|
|
23
|
-
"_thinking_comment": "Top-level
|
|
24
|
-
|
|
24
|
+
"_thinking_comment": "Top-level. The previous ninfer engine REJECTED chat_template_kwargs (HTTP 400 chat_template_option_not_supported), which is why qwen36.json carries the nested form and this profile dropped it. The current backend runs llama.cpp --jinja, where chat_template_kwargs is native and supported. The proxy probes the backend once and adapts (PROXY_CHAT_TEMPLATE_KWARGS=auto|on|off), so the top-level form remains correct and safe either way.",
|
|
25
25
|
"dynamic_temperature": {
|
|
26
26
|
"enabled": true,
|
|
27
27
|
"decay": 0.5,
|
|
28
28
|
"floor": 0.2,
|
|
29
29
|
"_comment": "On retry, temp = max(floor, base_temp * decay^attempt). Reduces randomness for structured output."
|
|
30
30
|
},
|
|
31
|
-
|
|
32
31
|
"tool_call_batching": {
|
|
33
32
|
"enabled": true,
|
|
34
33
|
"system_prompt_suffix": "When multiple tools are needed, call ALL of them in a single response. Do not call one tool and wait - emit all tool calls together.",
|
|
35
34
|
"_comment": "Reduces round-trips by encouraging multi-tool emission in one turn."
|
|
36
35
|
},
|
|
37
|
-
|
|
38
36
|
"concurrency": {
|
|
39
|
-
"max_parallel_requests":
|
|
40
|
-
"_comment": "
|
|
41
|
-
"kv_capacity_shared":
|
|
37
|
+
"max_parallel_requests": 2,
|
|
38
|
+
"_comment": "Matches the server's 2 rails AND the proxy settings that scripts/sync-local-agent-configs.sh installs in the same change: PROXY_CONCURRENCY_LIMIT=2, UAP_MODEL_SLOTS=2 and — the one that actually protects the shared pool — PROXY_SESSION_ADMISSION_LIMIT=2. Those three must move together with this field: raising it while the proxy still serializes at 1 makes callers fan out and buy latency rather than throughput, and raising admission above the rail count admits more hot sessions than the pool can hold. NOTE this value is aspiration until that script is actually run; the live proxy env is the authority. Whether the second rail is EARNING anything is a separate question — check llamacpp:n_busy_slots_per_decode in /metrics: a prior reading of 1.002 over 139 requests meant the workload never had two concurrent requests at all.",
|
|
39
|
+
"kv_capacity_shared": true,
|
|
40
|
+
"_kv_shared_comment": "true since 2026-09-20: the fork forces --kv-unified whenever VBR runs with -np > 1 ('-np 2 without --kv-unified would disarm the degrade controller'). Rails share one 229376-cell pool rather than owning private slices."
|
|
42
41
|
},
|
|
43
|
-
|
|
44
42
|
"server_optimization": {
|
|
45
|
-
"kv_dtype": "
|
|
43
|
+
"kv_dtype": "vbr",
|
|
44
|
+
"_kv_dtype_comment": "VBR dynamic turbo: entry tier t8 (~q8_0 quality) degrading toward floor t4 (4.125 bits/value ~ q4_0) only as the pool fills, under an explicit 5120 MiB KV budget (--vbr-vram 5120M). The explicit budget replaced 'auto' on 2026-09-18 after auto resolved 9536 MiB and overcommitted the card through THREE SIGABRT core dumps. A fourth dump followed WITH the 5120M budget already in place; that one was fixed by dropping the pool 262144 -> 229376, not by the budget. Do not fold it into the budget's evidence.",
|
|
46
45
|
"prefill_chunk": 1024,
|
|
47
|
-
"max_context":
|
|
48
|
-
"kv_capacity":
|
|
46
|
+
"max_context": 229376,
|
|
47
|
+
"kv_capacity": 229376,
|
|
48
|
+
"_capacity_comment": "Shared pool total across both rails, NOT per rail. Per-session allowance is context_window above.",
|
|
49
|
+
"parallel_rails": 2,
|
|
49
50
|
"speculative_decoding": {
|
|
50
51
|
"enabled": true,
|
|
51
|
-
"type": "
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
52
|
+
"type": "draft-dflash",
|
|
53
|
+
"draft_model": "Qwen3.8-27B-DFlash2-Q4_K_M.gguf",
|
|
54
|
+
"draft_max": 4,
|
|
55
|
+
"draft_min": 0,
|
|
56
|
+
"_comment": "A real 1.06 GiB draft MODEL, not self-speculation. Replaces the previously recorded '--spec mtp --draft-tokens 3 --lm-head-draft' (that was the ninfer engine's built-in MTP). DFlash2 was measured on this box 2026-09-12 to beat the native MTP head at every depth (45/31/30 vs 36/20/13 t/s at 2k/32k/92k)."
|
|
55
57
|
},
|
|
56
|
-
"_comment": "These are the flags
|
|
58
|
+
"_comment": "These are the flags uap-gsq-rco-server.service is actually running under, recorded so a rebuild reproduces the measured behaviour.",
|
|
59
|
+
"_budget_tier_comment": "Budget arithmetic worth knowing: 5120 MiB / 229376 cells = 22.86 KiB/token, which is EXACTLY the t4 floor (4.125 bpv). The budget was sized so the full pool fits only at the WORST quality tier; at the t8 entry tier it covers roughly 107k tokens. Consequence of --kv-unified that did not exist at one rail: KV precision is now COUPLED ACROSS SESSIONS. A lone agent at 60k sits at t8; add a second agent at 60k and both degrade toward t4."
|
|
57
60
|
},
|
|
58
|
-
|
|
59
61
|
"measured": {
|
|
60
|
-
"date": "2026-
|
|
61
|
-
"gpu": "NVIDIA GeForce RTX 3090
|
|
62
|
-
"
|
|
63
|
-
"
|
|
62
|
+
"date": "2026-09-20",
|
|
63
|
+
"gpu": "NVIDIA GeForce RTX 3090, 24576 MiB",
|
|
64
|
+
"_gpu_comment": "llama-server resident is NOT a constant: VBR maps KV lazily, so it tracks pool occupancy. 16652 MiB was a cold-start reading on an empty pool and should not be quoted as steady state. Measured under real load the same day: ~19.5 GiB resident, ~3.2 GiB free. Budget headroom against the 3.2 GiB figure, not the cold one — and remember a vision request allocates image-encode buffers on top.",
|
|
65
|
+
"decode_tokens_per_second": 43,
|
|
66
|
+
"_decode_comment": "CODE GENERATION at shallow depth, which is the closest single number to agent work. Decode here is strongly workload- AND depth-dependent, so one number is always a simplification. Measured 3 reps each, greedy, 220 max_tokens, via scripts/bench-decode-reps.sh: code 41.1/45.7/43.0 tok/s | prose 25.4/25.1/32.3 | counting 52.2/52.7/54.2. Depth matters as much: an earlier probe run measured ~72 at ~100 tokens of context but only ~32 at 27k. The DFlash2 rows above (45/31/30 t/s at 2k/32k/92k) remain the best depth-resolved characterisation. An earlier version of this file recorded 72 tok/s from a SINGLE rep on 'count from 1 to 40' — a degenerate, near-perfectly draftable prompt at zero depth. Do not quote a decode number without saying which workload and what depth.",
|
|
67
|
+
"draft_acceptance": 0.71,
|
|
68
|
+
"_draft_acceptance_comment": "Code generation, 3 reps: 67.8/73.4/71.7%. Strongly prompt-dependent — prose only reaches 30.5-39.8%, while counting hits 93.9-97.7%. The 0.90 previously recorded here came from the counting prompt and is not characteristic of anything an agent does.",
|
|
69
|
+
"prefill_tokens_per_second": 900,
|
|
70
|
+
"_prefill_comment": "Bulk prefill on unique (uncacheable) prompts: ~927 t/s at 3.5k, ~899 at 13.7k, ~883 at 27.4k, ~751 at 41k. A previously recorded 105 t/s was fixed per-request overhead measured on a ~100-token prompt, not a prefill rate — wrong by roughly 8x. Rough model: ms/token = 1.03 + 6.3e-6*N.",
|
|
71
|
+
"concurrent_2_rail_throughput": null,
|
|
72
|
+
"_concurrency_comment": "STILL UNMEASURED. Decode on this card is memory-bandwidth-bound, so the expected win from the second rail is OVERLAP (no head-of-line blocking; one session's prefill can proceed during another's decode), NOT 2x throughput. The honest acceptance test is llamacpp:n_busy_slots_per_decode from /metrics: a prior investigation recorded 1.002 over 139 requests, i.e. the workload never actually had two concurrent requests and the second rail bought nothing. Require that metric to exceed 1 under real load before claiming the rail is earning its keep."
|
|
64
73
|
},
|
|
65
|
-
|
|
66
74
|
"routing": {
|
|
67
75
|
"endpoint": "http://127.0.0.1:4000/v1",
|
|
68
|
-
"_comment": "Route through the anthropic-proxy, NOT the inference server directly — the proxy applies the tool/finalize guardrails and
|
|
76
|
+
"_comment": "Route through the anthropic-proxy, NOT the inference server directly — the proxy applies the tool/finalize guardrails and, via this profile, the per-session context window that clients size their history to. Clients select this profile with the header 'x-uap-model-profile: qwen38' (or a uap_model_profile body param)."
|
|
69
77
|
}
|
|
70
78
|
}
|