docs(adr): ADR-078 — multimodal/vision serving priority (deferral)#731
Conversation
Eighth/final sequencing ADR (bundle I). Records the PRIORITY placement of multimodal serving (deferred-not-ranked, gated on the vision dev lane) — distinct from ADR-069's already-accepted technical vision design, which it does not re-litigate or amend. Verdict rests on source/issue state at origin/main@594b557be: serve fails closed on image_url (PR #656), vision module inert scaffold (called only from tests), zero vision fields in the runtime config, ADR-069 merged (#669), S1 idle as draft PR #670, tracking #564/#565/#566 open. Explicit non-deprioritization: vision is an active tracked dev lane. No experiment needed; amends nothing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ed re-entry trigger R1 mediums, TBV'd vs origin/main@594b557be: - M1 (R2): generate_multimodal has more test callers than listed (:22396,:22417 in metal_generate_multimodal_honors_stop_string); rephrased to 'every live caller is a test fn' + VisionEncoder::new sole call site vision/mod.rs:265. Conclusion (no binary/non-test path) unchanged. - M2 (R3): 'zero Metal references' overstated — 5 doc-comment Metal mentions exist (vit.rs:12,14; mod.rs:19; multimodal.rs:7,38). Rephrased to 'no Metal implementation/API; only doc comments'. Leo press-time gate: added a NAMED re-entry trigger to the gated-deferral decision (ADR-069 S5-S6 served-parity milestone, or explicit #564 lane scheduling) so the deferral has a concrete re-entry condition, not an open-ended park. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ohdearquant
left a comment
There was a problem hiding this comment.
SPEC-GATE: SIGNED (Leo). Both press-time reads verified at content level: the re-entry trigger is named and two-armed (ADR-069 S5-S6 parity-gated served path, OR an explicit decision scheduling #564) so this is a decision with a re-entry condition rather than a parking ticket, and the explicit non-deprioritization paragraph routes through the public tracking issues with the fail-closed contract correctly pinned as the honest current state. With this press the sequencing set 071-078 is COMPLETE: eight ADRs, every verdict measured, experiment-gated, or deferral-with-named-trigger, zero survey-trusted rankings, all corrections landed as cited amendments. The P2-scope hold is exactly right — do not cut the build branch until the shipped-fusion recon resolves and I sign the scope; finding a possibly-already-shipped P2 half by applying the lane's own shipped-not-greenfield check to itself is the discipline paying for its keep.
ADR-078 — Multimodal / Vision Serving Priority (Deferral)
Eighth and final sequencing ADR in the bundle set (siblings ADR-071…077). Docs-only — one new
file. Records the priority placement of multimodal / vision serving, distinct from the
already-accepted technical vision design in ADR-069 (which it does not re-litigate or amend).
Verdict — DEFERRED-NOT-RANKED (gated on the vision dev lane)
Multimodal serving does not enter the near-term lever ranking of this bundle: there is no served
image capability to optimize at head. The vision path is inert scaffold, and the correct interim
serving contract — a truthful fail-closed 400 — is already shipped. This is a priority-sequencing
decision, not a technical one; ADR-069's staged S1–S6 recalibration is accepted and stands.
Measured / source-verified (
origin/main @ 594b557be)image_url→ HTTP 400"image input requires a vision-capable model",tested at unit + HTTP levels (
lattice_serve.rs:183,:799-800, tests:2169/:2478; PR fix(serve): fail-closed roles and content parts, OpenAI content-parts arrays, config-derived max context (#641, #649 API, #551) #656).VisionEncoder/generate_multimodalconstructed/calledonly from
#[cfg(test)]modules (metal_qwen35.rs:8788, callers:20700,:21694,:22396,:22417;VisionEncoder::newsole call sitevision/mod.rs:265;lib.rs:44unconditionalpub mod vision).vision/*.rs; the only Metalmentions are doc comments naming the not-yet-implemented Metal path (
vit.rs:12,14,mod.rs:19,multimodal.rs:7,38).Qwen35Configcarries zero vision fields (parser drops them by design pending S1).c2c23e444); S1 already written, idle as draft PR feat(inference): parse Qwen3.5 vision config fields (ADR-069 S1) #670(
feat/vision, +296/−4, tests green); tracking issues feat(vision): vision tensors lane — image input path (preprocess, ViT ops, projector) [tracking] #564/feat(audio): audio tensors lane — speech-in frontend (STFT/mel) + encoder [tracking] #565/feat(models): Gemma 4 model family support [tracking] #566 open.Framing
Explicit non-deprioritization: vision is an active, tracked development lane. "Deferred in the
near-term serving-lever ranking" ≠ "vision deprioritized." The deferral carries a named re-entry
trigger — multimodal serving re-enters the ranking when either (a) the vision lane reaches
ADR-069 S5–S6 (S5 gate: end-to-end greedy first-N token parity vs HF Qwen3.5-0.8B; S6: chat/serve
wiring), the first point at which served-multimodal latency/throughput is a real optimization target,
or (b) an explicit decision schedules the vision build lane (#564) as near-term. Until one fires,
the vision work is build-lane work (land PR #670 → ADR-069 S2–S6, tracked #564). No experiment
needed; amends nothing. An S-row rider records the eventual activation whichever way the ranking
then falls.
Docs-only; no code paths change.