Commit 37740ec
* spec: minor lobe — warm co-resident Qwen3.5-4B (#64)
Converged devague /think spec for issue #64. Scope (user-confirmed) is the full
minor-role runtime, not just a catalog row:
- add Qwen3.5-4B as a role_hint=minor catalog gear, served bf16 WARM CO-RESIDENT
behind the gateway
- new read-only verbs: lobes run/route/eval, with route picking across lobes
GEARS only (v1) plus an escalate flag + confidence
- escalation + confidence governance (minor may prepare/classify/format/validate/
suggest; config-blocked from approve/finalize/delete/deploy/architect)
- bf16 base chosen to ENABLE later unsloth-LoRA fine-tuning (training deferred)
Surfaces two code constraints beyond the catalog edit: _parser.py must learn the
qwen3.5 family (qwen3_coder, not hermes), and the catalog needs a convention for
an unquantized bf16 generate gear. Verified model facts (hybrid linear-attn+ViT,
multimodal, built-in MTP head, 256K, Apache-2.0) folded in. Includes the
converged frame state.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* eidetic-memory: minor-lobe spec findings (#64)
Records the verified Qwen3.5-4B HF facts, the minor-lobe spec decisions, and a
devague tooling gotcha (rejecting a claim does not clear its blocking hard
question; gate needs honesty on every spec-affecting claim).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* plan: minor lobe — Qwen3.5-4B build plan (#64)
Forward leg (devague /spec-to-plan) from the converged minor-lobe spec. 11 TDD-
gated, file-disjoint tasks in 5 dependency waves covering all 26 spec targets:
wave 1 t1 catalog+bf16 convention · t2 parser rule · t3 minor urllib client
wave 2 t4 governance/escalation · t5 run verb · t7 eval verb · t9 co-residency
wave 3 t6 route verb · t10 docs
wave 4 t8 wire run/route/eval into the CLI (sole owner of cli/__init__.py)
wave 5 t11 end-to-end signals + read-only safety verification
Risks: GB10 boot/NVFP4 quality untested (CI checks config only); confidence-
metric source is a defined v1 heuristic; train/eval-contents/MTP-spec-decode
deferred. Ready for /assign-to-workforce.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(parser): recognize Qwen3.5 family as qwen3_coder (t2, #64)
* feat(minor): stdlib urllib client for the minor backend (t3, #64)
Add lobes/minor/ package with chat_completion() and chat_text() helpers
that POST OpenAI chat-completions requests using only urllib/json (no
third-party deps). Tests use a real ephemeral HTTPServer on 127.0.0.1:0.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(minor): governance + escalation model for the minor role (t4, #64)
* feat(cli): lobes run minor verb (t5, #64)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(cli): lobes eval minor verb (t7, #64)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(catalog): add Qwen3.5-4B minor gear + bf16 'none' convention (t1, #64)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(run): reconcile catalog-minor assumption after t1 merge (#64)
* feat(cli): lobes route verb across gears (t6, #64)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(fleet): opt-in co-resident minor backend + gateway routing (t9, #64)
Add a `vllm-minor` compose service (Qwen/Qwen3.5-4B, bf16) behind
`profiles: [minor]` so a default `docker compose up` never starts it.
Wire gateway routing to route `model: Qwen/Qwen3.5-4B` to the minor
backend when MINOR_BASE_URL / MINOR_SERVED_NAME are set (env-gated via
the same `_optional_backend` pattern as fallback/embed/rerank). Without
those env vars the routing table is exactly as before.
Details:
- lobes/templates/fleet/docker-compose.yml: vllm-minor service with
profiles: [minor], container_name model-gear-vllm-minor, healthcheck,
--language-model-only (text-only, drops ViT), NO --quantization (bf16),
${VLLM_MINOR_MAX_MODEL_LEN:-32768} / ${VLLM_MINOR_GPU_MEM_UTIL:-0.10}.
Gateway env gains MINOR_BASE_URL / MINOR_SERVED_NAME with empty defaults
(opt-in gate: both empty → no backend added).
- lobes/gateway/_config.py: _DEFAULT_MINOR constant + _optional_backend
call (url_key=MINOR_BASE_URL, name_key=MINOR_SERVED_NAME, task=generate).
- tests/test_fleet_minor.py: 17 new tests — gateway routing (TDD-first:
opt-in gate, URL normalisation, resolve_model, order_backends failover
to primary, embed-task isolation) and compose template assertions
(vllm-minor present, profiles, --language-model-only, no --quantization,
container_name, healthcheck, always-on services unchanged).
453 passed, 3 skipped (pre-existing numpy skips). No regressions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(cli): wire run/route/eval verbs + align eval endpoint (t8, #64)
Register run/route/eval in _build_parser(); change eval _DEFAULT_BASE_URL
from port 8001 to 8000 (the gateway) to match run.py and route.py; add
tests/test_cli_wiring.py asserting each verb is reachable and dispatches
to the correct handler.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: minor lobe governance, co-residency, fine-tune target (t10, #64)
* docs(minor): align eval base-url to gateway :8000 after t8 (#64)
* test: minor-lobe end-to-end integration + read-only safety (t11, #64)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: bump version 0.29.0 -> 0.30.0 (minor lobe, #64)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(route): disable thinking + cap max_tokens so route doesn't time out (#64)
Live-surfaced on the GB10: the 4B in thinking mode emitted a long <think>
trace before the routing JSON, blowing past the client's 60s timeout. Add an
extra_body passthrough to the minor client and have route disable thinking
(chat_template_kwargs.enable_thinking=false) + cap max_tokens=512. Verified
live: terse parseable decision; governance escalation intact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(minor): note live GB10 verification + serving flags (#64)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: sync uv.lock to 0.30.0 (#64)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* eidetic-memory: Qwen3.5 vLLM 0.19 serving finding (#64)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style(run): merge implicit string concat in --model help (#64)
Addresses a review finding (ISC001 same-line literal concatenation).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(minor): address Qodo review findings on #65 (#64)
- route low-confidence escalation (qodo 3481974171): governance gains an
UNCERTAINTY_THRESHOLD (0.25, per issue #64); decide() escalates when
confidence is below it; route passes confidence through.
- route escalation bypass (qodo 3481974173): normalize the model's conditions
(str -> [str], strip/lower; no char-splitting), clamp chosen_gear to known
roles, and fail closed on a malformed conditions field.
- bf16 notice on flag (qodo 3481974176): the REMOVE --quantization compose-edit
notice now fires on the effective quantization choice — explicit
--quantization none on an uncatalogued model included, not just catalog
metadata.
- missing eval suite (qodo): ship examples/minor-evals/smoke.jsonl and point the
doc's `lobes eval minor` example at it.
Regression tests added for each. Full suite 504 passed; flake8/black/bandit clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 03817a3 commit 37740ec
37 files changed
Lines changed: 4942 additions & 15 deletions
File tree
- .devague
- frames
- plans
- .eidetic/memory
- docs
- plans
- specs
- examples/minor-evals
- lobes
- cli
- _commands
- gateway
- minor
- runtime
- templates/fleet
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
Lines changed: 314 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
0 commit comments