# Changelog

## v0.6.5

- chore(main): release 0.6.5
- fix(gateway): preserve ref sibling schema semantics
- fix(gateway): dereference structured output schema refs
- refactor(sidecar): inline applied bundle hash
- fix(config): fingerprint model pool ownership
- chore(worker): address SGLang load review nits
- fix(gateway): align provisioning contract docs
- fix(gateway): address provisioning review feedback
- fix(server): guard readiness for removed configs
- test(server): fix ipc registry mock snapshot
- docs: clarify pool capacity semantics
- fix: align GPU memory pressure defaults
- fix(server): honor pool-aware model configs
- fix(gateway): make provisioning non-2xx universally
- fix(worker): keep SGLang loads off event loop
- fix(gateway): return retryable OpenAI provisioning errors
- test(server): cover qwen3 vl reranker document image ordering
- fix(sdk): normalize score images for wire transport
- fix(server): render qwen3 vl reranker document images in user prompt
- fix(gateway): decode native media JSON bytes
- fix(deps): bump sidecar prometheus for protobuf advisory
- fix(config): harden replace snapshot IPC
- fix(config): replace drifted export snapshots
- fix(config): detect bundle config hash drift
- fix(sie-cluster): add spot toleration to AKS worker pool

## v0.6.4

- chore(main): release 0.6.4
- fix(sidecar): preserve msgpack work item payloads
- fix(gateway): resubscribe stale NATS health stream
- feat(helm): ship values-aks.yaml AKS overlay with the Azure module
- fix(helm): render selectorLabels after podLabels in workload templates
- feat(helm): expose chart-level podLabels for Workload Identity wiring
- feat(helm): accept abfs:// and abfss:// payloadStore + clusterCache URLs

## v0.6.3

- chore(main): release 0.6.3
- test: stabilize SDK timeout retry assertion
- fix: fall back to relay on S3/GCS server-side copy failure
- feat: add server-side copy fast path for cloud weight sync
- fix: address final cloud storage review issues
- fix: harden cloud cache sync paths
- fix: address azure cache review feedback
- feat: support azure blob cluster cache
- feat: add azure blob payload store support
- fix(generate): reject both-present image-bearing content layouts
- fix(generate): image-free content_parts field must not shadow layout
- feat(generate): preserve text/image content-part ordering
- fix(nemo_colembed): trim left-padding rows from v1 conformant doc embeddings (#1163)
- perf(nemo_colembed): engage conformant image preprocessing for v1 (#1163)
- fix: evict stale gateway workers on shutdown
- fix(generate): address huronat review on vision input (F2-F8)
- fix(generate): address CodeRabbit review on vision input
- feat(generate): add vision (image) input to generate()
- fix(deps): clear HIGH Dependabot alerts (docling, rustls-webpki)
- fix(bench): address CodeRabbit — accurate classification comment + quote-agnostic test
- fix: align extraction quality evals with source baselines
- feat: add m4 extraction model configs

## v0.6.2

- chore(main): release 0.6.2
- fix(server): consolidate runtime ninja install
- fix(server): install ninja in cuda runtime
- fix(helm): scale single-profile bundles on gpu-agnostic demand
- fix(dev): address KEDA Tilt PR review
- feat(dev): refresh KEDA Tilt local dev branch
- fix: accept dense dim in qwen3 vl embedding adapter
- feat(models): add M4 dense encoders mxbai-embed-large-v1, arctic-embed-l-v2.0, modernbert-embed-base

## v0.6.1

- chore(main): release 0.6.1
- fix(gateway): fail fast on invalid static pool config
- fix(gateway): canonicalize static queue pool names
- feat(gateway): support static queue pools

## v0.6.0

- chore(main): release 0.6.0
- fix(helm): preserve worker-group queue defaults
- test(gateway): assert capped lane pending demand
- docs: align queue lane naming
- fix(helm): align lane defaults and tilt e2e
- fix(gateway): harden queue lane admission
- feat(gateway)!: route work by queue pool lanes
- feat(helm)!: default SIE_POOL to pool name (not "default")
- fix(deps): bump vitest 2.1.9 -> 4.1.0 (CVE-2026-47429)

## v0.5.0

- chore(main): release 0.5.0
- docs(helm): clarify README pool example is illustrative, not tester-specific
- fix(helm): fail-fast on missing/invalid bundle replica bounds
- chore(helm): address PR #1205 review feedback
- fix(helm): preserve gateway metrics scrape labels
- feat(helm)!: split worker pools into pool × bundles schema
- fix(gateway): expose unauthenticated metrics scrape port
- chore(openapi): regenerate spec for code/sql/guard capability fields
- fix(models): drop unsupported ebnf advertisement + restore guardian a100 guard threshold
- feat(models): surface code/sql/guard capabilities; resolve job aliases in configs/resolve
- fix(guard): robust verdict thresholding, logprob hygiene, decoded-token logprobs
- feat(tester-cluster): add sglang worker pool for generative models
- fix(sie_server): honor params.instruction in Florence-2 extract (#1053)
- fix(helm): use sidecar binary for image pre-pull
- chore: remove agent-jobs runbook, ADR 0001, and m5-planning docs
- fix(guard): reject multi-candidate sampling + keep logprobs consistent on rewrite
- feat(guard): P(unsafe) logprob threshold for CHECK POLICY precision (#1187)
- docs(ops): agent-jobs prod-readiness runbook + opt-in model-alias deploy config
- fix(review): address #1184 review comments + restore dropped A/B fix
- bench(sql): grammar A/B + SQLCoder native-template measured on Spider
- test(gateway): end-to-end precision routing through resolve_model_and_bundle
- test(gateway): prove a model routes across two precision bundles
- feat(gateway): job aliases can carry a precision bundle (SQL->BF16 routing)
- docs(27b): flag FP8 SQL regression on sql cap + clarify targets are documentary
- feat(27b): measure Qwen3.6-27B on code/SQL/tools; advertise code+sql
- feat(guard): CHECK POLICY content-moderation model + ToxicChat F1 eval
- bench(sql): measured Spider execution accuracy + anchored floor; SQLCoder serve-validated
- feat(code): point model="code" at the measured model; xgrammar-validate SQL grammar
- feat(sql): onboard SQLCoder (Defog) config + starter SQL grammar artifact
- feat(bench): add Spider text-to-SQL execution-accuracy eval + model="sql" alias
- fix(review): address PR feedback on the code-eval
- feat(server,gateway): advertise code capability + model="code" alias

## v0.4.2

- chore(main): release 0.4.2
- Scope SGLang CUDA toolkit runtime
- Enable CUDA toolkit in SGLang worker runtime
- perf(mineru_vl): O(L) incremental no-repeat-ngram for greedy decode
- feat(sie_server): add MinerU2.5-Pro-2604-1.2B doc OCR adapter
- build(deps): upgrade rust toolchain to 1.96
- feat(models): add Marqo/marqo-fashionSigLIP (SigLIP open_clip, fashion image-text)
- fix(ci): keep sidecar out of warm cache
- fix(review): 0.6B ctx test 1024->4096, loader except logs, README gaps resolved
- fix(ci): avoid nested mise in integration fixture
- docs: align sidecar naming in active docs
- fix(deploy): align server sidecar naming
- fix(deploy): document worker-sidecar metrics wiring
- fix(deploy): rename sidecar container to worker-sidecar
- fix(deploy): align server sidecar naming and kind preload smoke
- fix(deploy): publish server sidecar image
- feat(model): bump Qwen3-0.6B serving context 1024→4096 for prod simple-task use
- fix(bench): let via-SIE smoke serve a profile-variant model end-to-end
- fix(loader): wire profile runtime.default_sampling into the adapter
- feat(model+bench): RTX-PRO-6000 FP8 profile for Qwen3.6-27B + 6000 validation
- refactor(glm_ocr): select patch-embed conv strictly by structure (CodeRabbit)
- perf(glm_ocr): rebind vision Conv3d patch-embed to F.linear
- chore(adapters,ci): remove Vidore3 throughput diagnosis instrumentation
- fix(test): restore donut helper call contract
- fix(ci): address analyzer findings and stale queue test
- fix(adapters): replace Qwen3-VL vision Conv3d patch-embed with matmul
- chore(helm): clean sidecar chart observability
- feat(sidecar): add worker config and pool admission reconciliation
- TEMP(colqwen3): time vision sub-modules (patch_embed/block/merger)
- test(tilt): expand sidecar e2e coverage
- feat(sidecar): wire generation direct dispatch
- TEMP(colqwen3): split forward timing into vision vs text (revert before merge)
- fix(adapters): route Qwen3-VL VLMs through flash attention (Vidore3 throughput)
- TEMP(adapters,ci): timing instrumentation for Vidore3 throughput diag
- chore(openapi): regenerate gateway spec for min_tokens + chat_template_kwargs
- fix: address coderabbit + code-quality review on PR #1146
- feat(bench+model): via-sie 4-task n=300 sweep + NEXTN smaller-draft on 27B
- fix(worker): SGLang adapter accepts min_new_tokens kwarg + 27B via-sie validated
- fix: slow sidecar nats consumer reconcile
- fix: gate sidecar nats reconnect refresh
- fix: address pr review quality issues
- fix: harden sidecar config recovery
- chore: clean sidecar docs and packaging
- chore: prune sidecar compatibility paths
- docs(sidecar): clarify worker sidecar source naming
- fix(ci): refresh gateway openapi contract
- fix(quality): repair adapter eval harness regressions
- fix(worker-sidecar): harden queue carveout contracts
- fix: scope bundle config hash cache per registry
- chore: standardize worker sidecar packaging
- feat: reconcile live worker config in sidecar
- Add worker config reconciliation
- chore: clean worker sidecar deployment surfaces
- chore: enable rust sidecar in local tilt
- fix: require rust sidecar for queue workers
- docs: clarify worker config apply gap
- chore: consolidate inference sidecar package
- fix: preserve worker batch identity and publish image
- chore: finish rust worker rebase integration
- chore(helm): land S20+ rust-sidecar production tuning defaults
- chore: scrub stale sie_candle references and dead candle metric
- non-adapter carveout: ship sie_prep + wire passthrough end-to-end
- non-adapter carveout: retire sie_candle, carve out sie_prep, Python passthrough
- sie_worker_rust + sie_server: queue-depth metrics for IPC+Python loop
- worker-rust + sie_candle: NATS health heartbeats and BERT cross-encoder
- rust-worker: retire SIE_RUST_*_MODELS env vars, carve sie_candle out into its own crate (Stage 3 P1)
- rust-worker: land Stage 1 (tokenise + framing) + Stage 2 (scheduler) + Stage 3 design
- adding perf-tuning grafana dash fixes and extension
- obs(helm): perf-tuning Grafana dashboard + ConfigMap
- perf(rope_flash): vectorize CLS/mean pooling, eliminate per-item .item() sync
- perf(adaptive): anchor min_batch_cost floor at max_batch_tokens // 4
- revert: restore adaptive batching defaults to 15/50ms
- perf(batching): tighten adaptive wait ceiling + revert gte-multilingual 32k
- perf(gte-multilingual-base): raise max_batch_tokens 16k → 32k to stop IPC-batch shred
- perf(server): FP16 on GPU, coalesce sized for IPC bursts, starvation self-heal
- obs(worker+server): audit follow-ups for phase + fragmentation metrics
- obs(worker+server): surface GPU phase latency + IPC-batch fragmentation
- feat(worker/rust): IPC connection pool — lift the sidecar's last serialization bottleneck
- fix(gateway+server): queue is the only mode — kill direct-mode cruft
- fix(gateway): suppress H9 first-chunk-fallback on single-worker pools
- worker(rust)+sie_server: post-audit P0 fixes — drain min-deadline, fallback eviction tests, dispatcher outcome binding, encoder UnsupportedModel coverage, model-label cardinality tests
- worker(rust): finalise pre-Argo audit — native Candle, fallback breaker, full observability, Docker + Helm
- chore(sie-server): drop dead code left over from sidecar cutover
- fix(worker): harden payload store + error paths; surface silent success bugs
- sie-server: commit to sidecar-only queue path; remove Python NATS
- feat(sie_worker_rust): close parity gaps with Python pull loop + smoke test
- feat(sie_server): UDS msgpack IPC server for Rust worker sidecar
- feat(sie_server): carve out QueueExecutor + IPC types for Rust worker POC
- feat(bench): 0.6B via-sie validated; harness + 27B config gains
- fix(model): bump Qwen3.6-27B default/h100 mem_fraction_static 0.85 → 0.92
- feat(gateway+worker): chat surface accepts min_tokens + chat_template_kwargs
- fix: accept dense_dim in dense adapters
- test: align structured output metric constants
- fix(sie_server): clear CUDA cache on uncovered VLM paths + drop private sem _value access
- chore: remove internal design doc references
- docs: clean stale design references
- docs: minimize design architecture docs
- docs: update design document references
- docs: remove internal planning references
- docs: archive obsolete roadmap
- fix(security): cap vite at ^6 + add Node engines to website
- feat(gateway): strengthen generation isolation guardrails
- feat(docling): accept image input + run on OCR-bench quality path
- fix(security): bump sie_ts_sdk standalone pnpm transitives
- fix(security): bump root pnpm deps + add overrides for transitives
- fix(security): bump root Python deps to patched versions
- fix(security): bump gateway deps to patched versions
- chore: drop CodeQL rationale comments
- fix(quality): batch3 of CodeQL findings + bench KIE bug
- fix(quality): drop redundant inline imports in donut + registry
- fix(security): use Reflect.construct for WebSocket headers shim
- fix(quality): close CodeQL quality-tab findings
- Fix gateway queue trace isolation
- perf(bench,adapters): parallel VLM sub-batch dispatch + drop redundant empty_cache
- Keep generation machinery off default queue path
- docs(test): note `:` -> `__` replacement in test_model_yaml_filenames docstring
- fix(models): rename ColQwen3 YAML to match sie_id casing (TomoroAI)

## v0.4.1

- chore(main): release 0.4.1
- fix(security): resolve 18 open CodeQL alerts
- Revert "Fix pool queue batching coalescing"
- Fix pool queue batching coalescing
- refactor(release-docker): remove sie-deps prebake; build deps in-band
- fix: refresh generation pool fallback on hot add
- fix: isolate generation direct dispatch
- feat(server): add Qwen3.6-27B model + migrate to CUDA 12.9

## v0.4.0

- chore(main): release 0.4.0
- chore(release-docker): scrub overcommenting and internal-naming leaks
- fix(gateway): add NATS config trusted producers helm override
- ci(release-docker): pre-bake sie-deps base images keyed on lockhash
- chore(release): drop cuda11 from docker build matrix
- fix(helm/sie-cluster): guard validateTls probe against deployments with nil labels
- feat(openapi): add tool_calls support to chat completion schema
- style: format code to comply with line length limits
- fix(gateway): document ModelCapabilities in OpenAPI + refresh on profile delta-update
- fix(gateway): scope LoRA adapter capabilities per profile (M10)
- fix(generation): cancel tombstone prevents first-chunk fallback double-execution (H9)
- feat(gateway): /v1/generate accepts seed/logprobs/logit_bias/n/best_of/lora_adapter (M8)
- docs(openapi): rewrite schema to match implemented chat/completions/responses surface (M2)
- fix(helm/sie-cluster): probe cert-manager controllers cluster-wide
- fix(helm/sie-cluster): include cert-manager mode in presence-check gate
- fix(helm/sie-cluster): label-based cert-manager detection + bidirectional runtime check
- fix(helm/sie-cluster): one-step bundled cert-manager install with self-signed TLS
- docs(generation): A100 Outlines smoke closes H10 release gate
- fix(streaming): no-silent-drop on chunk-queue backpressure (H6)
- feat(gateway+worker): per-choice OpenAI streaming for n>1 (H4, H5, M4)
- docs(product): commit generation as 4th supported primitive (M3, M9)
- feat(gateway): add routing salt + byte-preserving key mode (M11)
- fix(gateway): tighten chat sampler/token-cap + tool-history validation (M1, M13)
- feat(worker): SGLang owns grammar; worker preflight opt-in only (H8, ADR-0002)
- fix: centralize worker_id subject normalization (M5)
- docs(generation): reconcile Qwen3.5 grammar-backend evidence (H10)
- fix(gateway): strict allow-list + 400 contract on /v1/responses (H2)
- fix(gateway): strict allow-list + 400 contract on /v1/completions (H3)
- feat(python-sdk): expose typed params for chat n/logprobs/lora_adapter/etc (M7)
- feat(ts-sdk): handle 202 provisioning in chatCompletions + expose missing fields (H1+M6)
- fix(gateway): generation timeouts bypass legacy request-timeout ceiling (H7)
- fix(generation): tighten lossy tool-control flags (M14)
- chore(lora): rename "LoRA-on-generation exclusion" to "legacy scalar lora_id"
- Fix async pool create delete races
- Await in-flight async pool creation
- Address pool admission review comments
- Fix pool admission cap semantics
- Fix pool cap admission semantics
- fix(ci): copy assets/ into the gateway Docker build (redoc bundle)
- feat(gateway): /v1/completions streaming (text_completion SSE)
- feat(gateway): /v1/responses structured array input (conversation history)
- feat(generation): streaming n>1 — per-candidate SSE interleave
- feat(gateway): accept OpenAI multimodal content-parts; reject images (no VL model)
- feat(gateway): /v1/responses (OpenAI Responses API, MVP)
- feat(gateway): advertise lora_adapters on /v1/models + pre-validate unknown names
- feat(generation): best_of — over-generate + rank by logprob, return top n
- feat(gateway): /v1/completions (legacy OpenAI Completions, raw-prompt)
- feat(worker): wire mixed-pool fairness scheduler into the pull-loop (opt-in)
- Revert "feat(gateway)!: fail-closed authentication (default-deny)"
- Revert "fix(dev): set explicit auth opt-in for local gateway launchers (post fail-closed)"
- Enable cloud log observability overlays
- fix(generation): LoRA lora_path is a top-level /generate field, not a sampling param
- feat(generation): multi-LoRA serving (one base, N adapters, per-request) (roadmap 6.2)
- Disable cloud log observability by default
- Sync Helm dependency lock
- feat(generation): multi-candidate n>1 (non-streaming) end-to-end (roadmap 1.5)
- Enable cloud Loki Alloy overlays
- Add Loki Alloy log observability
- fix(dev): set explicit auth opt-in for local gateway launchers (post fail-closed)
- feat(gateway): register /v1/moderations as explicit 501 (roadmap 1.8, phase 3)
- feat(gateway): meaningful system_fingerprint on chat responses (roadmap 1.3/§5)
- feat(worker): WorkClassScheduler core for mixed-pool fairness (roadmap §6.1)
- fix(chart): pin image-prepull DaemonSets to GPU nodes
- feat(routing): cache-aware (prefix-hash) routing (roadmap §6.3)
- feat(gateway)!: fail-closed authentication (default-deny)
- feat(chat): regex/EBNF response_format + developer role (roadmap 1.7)
- docs: reconcile structured-output backend + fix chat-param docstring drift
- feat(gateway): serve a rendered API reference at /docs (Redoc)
- feat(gateway): unify /v1/embeddings on the OpenAI error envelope (roadmap 1.4)
- chore(openapi): regenerate server spec for GPU-aware health probes
- fix(server,gateway): add GPU-aware health probes to detect and recover from wedged CUDA contexts
- fix(sie_server): install cv2 system libs for docling extract
- fix(sie_server): enforce media bytes contract at every consumer (#1026)
- fix(sie_server): base64-decode JSON image inputs (#1026)
- feat(gateway,sdk,server): add OpenAI-compatible chat completions with streaming and sampling extensions
- fix(grammar): resolve tokenizer adapter for Outlines processor factories and remove anchors from regex patterns
- test(metrics): update api_key masking assertion and add clarifying comment
- fix(gateway,sdk,server): validate numeric fields and improve error handling
- refactor(gateway,sdk,server): harden request routing, dedup, and resource cleanup
- fix(gateway,sdk,server): prevent metric cardinality DoS and fix non-idempotent retry logic
- refactor(gateway,server): improve OpenAI compatibility and fix Docker build caching
- feat(gateway,server): add multi-turn tool-use support with OpenAI-compatible message format
- fix(helm/sie-cluster): regenerate Chart.lock with synced digest
- fix(helm/sie-cluster): make self-signed root-CA namespace configurable
- feat(helm/sie-cluster): bundle cert-manager + trust-manager (opt-in) with self-signed TLS mode
- chore(helm): decouple worker image bundle from logical bundle configuration
- fix(helm): trim and drop empty entries in ingress.hosts
- refactor(sdk,server,observability): simplify sampling parameter handling and fix concurrent HTTP client initialization
- fix(gateway,sdk,server): add wire-level validation, improve resource cleanup, and enhance observability across request lifecycle
- fix(gateway,sdk,server): strengthen validation and eliminate silent failures across request lifecycle
- feat(gateway,sdk,server): add native generate endpoint with improved admission control and validation
- feat(gateway): refactor streaming and routing with improved error handling and metrics
- build(gateway): add BSL-1.0 to allowed licenses in deny configuration
- chore: regenerate OpenAPI spec
- feat(generation): complete M4 req2 generation primitive with streaming, structured outputs, and routing
- Support configurable ingress.hosts in sie-cluster chart
- refactor(observability): add grammar label to TTFT/TPOT metrics and extend dashboard instrumentation
- feat(gateway,server): add HRW direct-dispatch routing with saturation-aware admission control
- refactor(routing): implement slice 05 HRW direct-dispatch with saturation-aware worker selection
- feat(gateway): implement slice 04 structured-output grammar validation and compilation
- feat: generate slice 03 chat completions + OpenAI error envelope
- feat(observability): implement generation POC metrics and dashboard (slice 07)
- feat: generate slice 08 gated validation trench
- fix(pytorch_embedding): accept and forward revision kwarg (#876)
- feat: generate slice 02 streaming async iterator
- feat: generate slice 01 walking skeleton

## v0.3.4

- chore(main): release 0.3.4
- fix(sdk): widen sie-sdk requires-python to >=3.12
- extend: GCP bucket provisioning, custom IAM roles, fix path mismatch
- fix(gateway): tolerate config conflicts in bootstrap, gate on sie-config ready
- feat(infra): default payload store to model-cache bucket /payloads
- fix(deps): pin opencv-python-headless to drop X11 runtime deps
- fix(chart): default workers to shared queue pool
- feat(ts-sdk): add ExtractOptions.adapterOptions for adapter knobs
- test(sdks): cover handle_error dispatch and tighten InputTooLongError tests
- feat(sdks): add typed InputTooLongError for extract 400 INPUT_TOO_LONG

## v0.3.3

- chore(main): release 0.3.3
- fix(docker): install libspatialindex-c6 in worker images
- refactor(gliclass): tighten IndexError discriminator with regex
- fix(gliclass): catch IndexError empty-tensor crash as InputTooLongError
- test(gliclass): cover _apply_overflow_policy per policy
- fix(gliclass): raise InputTooLongError from argmax-empty backstop
- chore(openapi): update openapi spec
- Fix gateway routing and autoscaling regressions
- Address Tilt PR review feedback
- Optimize gateway msgpack success responses
- Add kind Tilt gateway SDK E2E loop
- refactor(server): give overflow_policy a typed home
- test(adaptive-batching): add absolute tolerance to floating-point assertions
- docs(gliclass): document token accounting in _apply_overflow_policy
- chore(gliclass): refactoring
- chore(gliclass): remove redundant docstring _extract_text
- chore(gliclass): remove redundant "loaded" checks
- feat(server): enforce overflow_policy in gliclass adapter
- feat(server): validate overflow_policy in resolve_runtime_options
- docs(server): surface overflow_policy in extract OpenAPI schema
- feat(server): route INPUT_TOO_LONG to HTTP 400 in extract API
- feat(server): add new INPUT_TOO_LONG ErrorCode
- feat(model-loader): add post-download load timeout with stall-based download bounds
- fix(ci): peft-adapter base size + ocr force-heavy + drop hf_hub cap
- fix(bundles): cap huggingface-hub <0.32 in transformers5 bundle
- fix(ci): drop runner_class from public model YAMLs; route via HF size
- feat(ci): two GPU lanes (L4 + g7e) with model-driven routing
- fix(sglang): make startup timeout env-driven; bump default 300 -> 900
- fix(adapters): preserve encode order/boundaries (colqwen3) + lock v1 to_dict patch (nemo_colembed)
- fix(nemo_colembed): strip zero-padded rows from v2 batched embeddings
- fix(nemo_colembed): broaden AutoModel-failure catch for v1 fallback
- feat(adapters): add ColQwen3 and Nemotron ColEmbed v2 visual document retrieval

## v0.3.2

- chore(main): release 0.3.2
- test(fixtures): configure deployment environment for test containers and clusters
- ci(telemetry): add deployment environment tagging across internal infrastructure
- docs(gateway): document embeddings partial-success contract
- fix(docker): stub bundles/ and models/ in deps stage
- docs(gateway): clarify OpenAPI contracts
- fix(sie-server): include model and bundle directories in wheel distribution
- feat(sie_server): per-stage timing markers in lifespan for engine_boot attribution
- feat(sie_server): split adapter.warmup() out of load() with cold-start log markers
- feat(helm): wire probe templates to values trees
- feat(helm): expose probes value trees for worker/gateway/config
- fix(gateway): preserve scale-from-zero request path
- fix(gateway): preserve embeddings timing headers
- fix(gateway): address latest coderabbit contract notes
- docs(gateway): document service unavailable variants
- fix(gateway): close remaining review contract gaps
- docs(gateway): align embeddings encoding docs
- fix(gateway): reject unsupported embeddings token arrays
- fix(paddleocr_vl): pass use_cache=True to generate to enable KV-cache
- fix(gateway): address probe and SDK review findings
- feat(gateway): unify API errors and align probe contracts
- fix(docling): mark adapter unloaded in unload()
- fix(docling): cache DocumentConverter per (device, ocr_enabled)
- fix(chart): pass --cluster-cache to sie-server and correct populate command in docs
- docs(infra): drop mise wrappers from public-facing model-cache docs (#791)
- feat(infra): opt-in S3 cluster model cache (#791)
- docs(helm): correct Let's Encrypt rate-limit wording in README
- fix(helm): validate ACME server and privateKeySecretRef in validateTls
- docs(helm): address local reviewer suggestions on TLS work
- feat(helm): TLS termination via cert-manager + BYO matrix docs
- fix(gateway): address PR review for NATS health mode
- fix(gateway): align CreatePoolRequest OpenAPI with runtime validation
- fix(gateway): clarify experimental NATS health mode
- feat(gateway): expose OpenAPI contract
- feat(docling): add ocr profile defaulting do_ocr=true
- fix(docling): thread device through PdfPipelineOptions accelerator_options
- fix(review): tighten score_pairs options handling and query text validation
- refactor(eval): consolidate colbert model lists and improve query validation
- feat(adapters): default score_pairs() in BaseAdapter + baseline reranking targets
- refactor(colbert): hoist score-pair grouping helper to _utils
- feat(server): emit INFO log on invalid SIE_TORCH_NUM_THREADS fallback
- feat(server): cap torch CPU threads at worker startup

## v0.3.1

- chore(main): release 0.3.1
- fix(bge-m3): tighten score_mode validation, drop module docstring
- docs(sdk,server): clarify MODEL_LOAD_FAILED covers transient cooldowns
- fix(bge-m3): extend score support to bge_m3 and bge_m3_flag adapters
- fix(sdk,server): address CodeRabbit review on terminal load failures
- fix(siglip): cast pixel_values to model dtype on open_clip path
- chore(server): regenerate openapi.json with state and last_error fields
- feat(siglip): add Marqo/marqo-ecommerce-embeddings-B via open_clip backend
- fix(server): add terminal failed state to model registry (sie-test#85)
- feat(bge-m3): support /v1/score with dense/sparse/colbert/hybrid modes

## v0.3.0

- chore(main): release 0.3.0
- review: label-aware merging in stablebridge pruner spans
- fix(adapters): validate runtime max_seq_length overrides before clamp
- review: fail fast on missing PruningHead keys
- review: tighten profile validation, encoding, fixture paths
- fix(gateway): align /v1/models error and list shapes
- fix(adapters): clamp runtime max_seq_length overrides in score_pairs
- feat: upstream Stablebridge pruner adapter + sie_bench evals
- fix(gateway): add GET /v1/models/{model} detail route
- fix(adapters): clamp flash adapter max_seq_length to model positional capacity
- fix(gliclass): return all label scores and bound input length
- fix(client): retry only transient connection errors under wait_for_capacity
- feat(oom): improve error semantics and budget exhaustion detection
- fix(sdk): retry on connection errors and generic 503s
- refactor(oom): extract SDK retry logic and refine server NAK semantics
- feat(oom): implement defensive exception fan-out and improve recovery metrics
- test(api): add coverage for lora load failure in encode endpoint
- test(docling): drop module-level docstring (CodeRabbit)
- fix(docling): per-task converter, hf_revision guard, callable typing (CodeRabbit)
- test(api): add regression tests for lora routing in encode handler
- feat(server): add reactive OOM recovery and proactive idle eviction
- feat(extract): add Docling adapter for PDF/DOCX/HTML parsing
- fix(sdk): has_children filters folder-marker objects (Refs #732, #654)
- fix(sdk): cluster cache prefix probe uses list, not head (Refs #732, #654)
- test: hoist non-optional imports to module top (CodeRabbit)
- feat(extract): plumb document items and structured `data` results
- fix(sdk): preserve caller-supplied document format over inferred (CodeRabbit)
- chore(openapi): regenerate spec after adding document modality
- feat(types): add `document` input modality across SDKs, server, and metadata
- test(adapters): mock get_embedding_dimension in sentence_transformer fixtures
- fix(types): adapt to ty 0.0.32 stricter ignore handling
- build(deps): add litellm>=1.83.7 to sie_dspy dependencies
- Re-seed ACTIVE_LEASE_GPUS sentinel after pool reset
- fix(gateway): pre-instantiate request/demand metric families on startup
- chore(gateway): address PR #721 review — pin deny config + drop no-op cov flag
- chore(gateway): bump Rust to 1.95.0, add cargo-deny audit + llvm-cov coverage
- chore(sdk): trim retry-comment verbosity, drop debug-context refs
- fix(sdk): retry mid-flight transport disconnects, not just timeouts
- fix(gateway): keep record_request async to match main's call shape
- fix(gateway): drop double-counted REQUEST_COUNT / REQUEST_LATENCY emit
- fix(gateway): address PR #716 review feedback
- docs(gateway): strip dangling PRD / improvements-doc section refs
- docs(gateway): scrub ghost references left over from the perf audit
- perf(gateway): cache SDK version parse, integer audit latency, UUIDv7
- perf(gateway): tighten cold-pool backpressure + cheaper QPS counter
- perf(gateway): move score-endpoint unwrap instead of cloning
- perf(gateway): fuse msgpack_numpy decode into the response path
- perf(gateway): publish work items concurrently + borrow shared fields
- perf(gateway): pass msgpack items through as rmpv::Value
- perf(gateway): trim per-request work on the inference hot path
- fix(observability): address PR review blockers on metrics PR
- feat(observability): add Prometheus metrics to sie-config and expand sie-gateway coverage
- docs(sdk): drop LORA_LOADING references from score/extract docstrings
- docs(sdk): correct wait_for_capacity docstrings to reflect actual retry matrix
- fix(gateway): emit X-SIE-Error-Code header on model-loading 503
- chore(gateway): drop dead AppError::UpstreamTimeout variant
- fix(gateway,sdk): map upstream timeouts to 503+MODEL_LOADING for SDK retry
- test(bundle-coverage): fail loudly on empty dirs and duplicate bundle names
- test(bundle-coverage): drop over-strict duplicate-adapter assertion and module docstring
- fix(config): surface mixed-profile unrouteable models and keep snapshot consistent on writes
- fix(config,cluster): surface unrouteable models loudly and helm-repo-add on pristine hosts
- fix(bundles): declare Qwen3-VL adapters in default bundle
- fix(gateway): prioritize epoch-rewind branch; harden no-thrash test; correct arch-guide on ephemeral restart
- docs: align config-management-api, design.md §10.10, and arch-guide with sie-config cutover
- test(gateway): lock in backwards-epoch recovery in config_poller
- chore(gateway,docs): address PR #702 review feedback
- chore(gateway,helm): drop deprecated SIE_CLUSTER_ROUTING surface on the gateway
- fix(helm): fail fast when gateway has no bundle source
- fix(gateway): make sie-config single source of truth for bundles with live resync
- perf(docker): add --link + move ARG BUNDLE to eliminate cross-bundle layer noise
- fix(kind-smoke): add --no-pool-isolation for static clusters + contract-drift fixes
- perf(docker): reorder stages for maximum BuildKit cache reuse
- perf(docker): normalize mtimes so shared venv layer is dedupable
- fix(kind-smoke): address bot review feedback
- fix(kind-smoke): wire sie-config image and helm overrides into kind cluster fixture
- perf(docker): split worker venv into shared + bundle-specific layers
- fix(docs): Update packages/sie_server/Dockerfile.cuda11
- fix(adapters): add input validation guards for empty/failed visual inputs
- slim worker Dockerfiles: smaller final image, faster first-request
- chore: integrate sie-config across release plumbing, helm, terraform, tests
- fix: address follow-up PR review nits
- fix(sie_config): address PR review feedback
- fix(tests): restore docker gateway smoke test after router rename
- fix(helm): enable NATS + JetStream by default to match queue clusterRouting
- chore(gateway): sync crate version with cluster release (0.2.0)
- fix(helm): default clusterRouting to "queue" on import-sie-router-rust
- chore(gateway): make gateway-fmt auto-fix by default
- fix(gateway,config): address PR review -- 404 for unknown models, 202 on default routing, full YAML propagation
- ci: publish sie-gateway image to GHCR on release
- fix(gateway,config): harden auth, trusted NATS producers, and recovery path; drop gateway HA default
- fix(gateway): normalize model ids in NATS work subjects + docs/tooling/ha cleanup
- chore: consolidate architecture doc and prune stale infra + docs
- fix(gateway,config,sdk): resiliency, concurrency, and cross-service hash parity
- chore(gateway,config): finish split audit — offload fs I/O, drop dead NATS accessors, align docs
- test(gateway,config): expand coverage; drop dead idempotency cache; rewrite split docs
- refactor(gateway): split sie-config into its own service; gateway is now consumer-only
- docs(gateway): reflect current sie-config state and lock infra decisions
- fix(config): emit identical NATS payload to bundle and _all subjects
- refactor: rename sie-router service to sie-gateway
- chore(sie-config): bump version to 0.1.10
- refactor: replace sie-router package with sie-config service
- Add PaddleOCR-VL-1.5 adapter (#659)
- fix(adapters): clarify video placeholder, validate token IDs, fix torch_dtype key
- fix(adapters): address review findings for Qwen3-VL adapters
- feat(adapters): add Qwen3-VL-Embedding-2B and Qwen3-VL-Reranker-2B multimodal adapters
- fix: guard score() and score_pairs() against empty input lists
- fix: address review findings — negative truncation guard, score() options, constant dedup
- feat: add Qwen3-Reranker-0.6B and 4B causal LM reranker support
- feat: add GLiNER2 and GLiNER-bi adapters (#632)
- fix(docker): propagate failure when all add-apt-repository retries exhausted
- fix(docker): add retry logic for deadsnakes PPA to handle Launchpad outages
- feat: add SigLIP 2 base-patch16-224 vision-language encoder
- feat(openapi): add static spec export and validation
- feat(adapters): add GLM-OCR adapter
- revert: test_async.py — belongs to a separate PR, not this epic
- fix: address CodeRabbit review comments on PR #615
- fix(docker): cache apt lists alongside apt cache to prevent stale index
- fix(cluster): emit base image tag in helm guidance; correct misleading docs (#609)

## v0.2.0

- chore(main): release 0.2.0
- docs: add telemetry documentation and clarify deployment guidelines
- refactor(observability): update tmp_path type hints from str to Path
- test(observability): fix telemetry test type hints
- fix(haystack): rename namespace alias to sie
- feat(observability): add anonymous usage telemetry
- feat(haystack): add haystack_integrations namespace aliases
- feat(deps): migrate from pynvml to nvidia-ml-py package
- feat(benchmarks): add MTEB NFCorpus evaluation results for ModernBERT-based embedders
- fix: install uv via curl instead of COPY --from ghcr.io
- feat(sdk): add max_concurrency param to SIEAsyncClient to prevent connection pool exhaustion
- fix(build): downgrade dockerfile syntax version to 1 for broader compatibility
- refactor(deployment): add model preloading configuration to Terraform and CLI validation
- feat(adapters): add ModernBERT flash dense embedding support with fallback mechanism
- fix(router): harden affinity spill with bounds check, clamp, and debug log
- feat(workers): implement model preloading at startup to reduce first-request latency
- fix(router): add overflow spill to break model affinity deadlock
- fix(router): make rejected requests visible to KEDA scaling metrics
- fix(adapters): remove redundant tokenizer validation and unused template parameter
- refactor(adapters): simplify template application logic and add chat token caching
- fix: address PR review — panel title, namespace variable
- fix(dashboard): queue routing dashboard accuracy and usability
- fix(release): add LanceDB integrations to release-please config
- refactor(adapters): consolidate adapter infrastructure with declarative specs
- perf(server): use sdpa attention for LightOnOCR (6x faster, no OOM)
- fix(server): harden LightOnOCR adapter and rename next bundle
- fix(server): add collate() and fix prepare() signature on LightOnOCRPreprocessor
- refactor(adapters): consolidate adapter infrastructure with declarative specs
- refactor(adapters): improve flash attention device handling and resource cleanup
- refactor(adapters): extract common flash adapter logic into reusable base and utilities
- fix(server): trim next bundle to only verified transformers 5.x adapters
- fix: restore accidentally deleted test file
- fix(server): remove accidental data symlink, default to bfloat16
- Delete packages/sie_server/tests/adapters/test_lighton_ocr.py
- feat(server): add next bundle and fix LightOnOCR for transformers 5.x
- feat(server): add lightonai/LightOnOCR-2-1B OCR adapter

## v0.1.10

- chore(main): release 0.1.10
- feat: add async, chunking, and streaming to Weaviate document enricher
- perf(lancedb): decouple scanner and SIE batch sizes in enrich_table
- fix(helm): use generic updater for both Chart.yaml version fields
- fix: handle BytesIO images in LlamaIndex and validate Weaviate classify config
- perf(lancedb): stream enrich_table batch-by-batch instead of full materialization
- perf(lancedb): use Lance scanner for column projection in enrich_table
- fix(observability): queue routing dashboard PromQL for NATS wait
- feat(observability): queue routing dashboard, NATS prom exporter, router image tag
- fix: update adapter tests and address code review feedback
- fix(integrations): address CodeRabbit review findings for LanceDB PR
- fix(helm): use generic release-please updater for appVersion
- test(router): add queue-mode score response key regression tests
- fix(router): use "scores" key in queue-mode score responses
- fix(helm): restore Chart.yaml deps from main, keep appVersion v-prefix
- feat(terraform): add evaluation cluster setup for AWS with multi-GPU support and updated configurations
- make sure extraction uses not just the entity response type but the other response types also, including integrations
- remove the code that made it seem as if we were passing topk param to server from typescript - this optimization doesn't make that much sense as the request is anyway much larger than response
- PY<>TS parity in terms of integration depth  for langchain and llamaindex
- multivector support update in integrations
- deduplicate integration logic into ts/py sdk package that the integrations already depend on
- feat(sdk): add get_model() and configure LanceDB release workflows
- feat(integrations): add LanceDB integration (Python + TypeScript)
- haystack and llamaindex get multi-modal integration
- weaviate integration improvements
- test(queue): add NATS server fixture and improve integration test reliability
- feat(dlq,pull-loop): improve DLQ routing and score response handling
- fix(config,queue,nats): correct cluster routing condition, stream max_age units, and reconnect state ordering
- fix(queue-routing): score response format and DLQ fallback routing key
- fix(queue-routing): configurable NATS fetch budget, Helm-wired queue params
- perf(router): bypass FastAPI for hot proxy paths via raw ASGI middleware
- perf(sdk+router): lazy msgpack_numpy.patch and pure ASGI middleware
- perf(router): remove msgpack_numpy global patch and BaseHTTPMiddleware
- perf(router): replace stdlib json with orjson for 3-10x faster serialization
- perf(router): reduce thread pool pressure by inlining small deserialization
- refactor(router): remove lock-free synchronization and batch work item serialization
- fix(helm): add recreate strategy for router deployment when nats config restore is enabled
- test(cluster): fix kind cluster tests for config API and port-forward restart support
- fix(queue-routing): resolve 5 bugs blocking NATS pull-based worker routing
- feat(worker): improve batch cost bounds and fix template logic
- fix: address review findings — error handling, validation, public APIs, tests
- fix(server): update tests to use max_seq_length instead of max_length
- test(adaptive-batching): replace time.sleep with mocked monotonic for deterministic integral accumulation test
- feat(adaptive-batching): add auto-calibration and PI controller with per-model profile overrides
- refactor(batcher): implement proportional coalesce scaling and adaptive batch wait precision
- feat: add pull-based worker queue routing and adaptive batching
- feat(config-api): implement idempotency and auth separation with profile conflict detection
- docs(config): clarify write auth token precedence and filter updates
- fix(server): align cross-encoder max_seq_length parameter with loader
- chore: review items
- chore: review items
- chore: review items
- chore: fix review items
- chore: remove git sync
- feat: implement Config Management API with NATS-based distribution and review fixes Add runtime model config additions via REST API (POST /v1/configs/models), with NATS pub/sub distribution to workers and S3/GCS/local persistence using epoch-based CAS. Workers track config convergence via SHA-256 bundle_config_hash reported through WebSocket status. Key components: - config_api.py: REST endpoints (list/get/add models, resolve, bundles) - config_store.py: Epoch CAS persistence (local/S3/GCS backends) - nats_manager.py: Router-side NATS publish + cross-router sync - nats_subscriber.py: Worker-side NATS subscribe + config apply - Helm/Terraform: NATS sub-chart, config store env vars, restore flow Also addresses 25 code review findings: M2/M12 medium fixes, L1-L16 low-severity fixes, T3-T10 test coverage gaps, D1-D7 doc/feature discrepancies, and H13 S3 conditional writes documentation.

## v0.1.9

- chore(main): release 0.1.9
- fix(helm): revert pool names to machine profile names
- fix: increase docker smoke test timeouts and add retry
- fix(helm): include $platform in worker image tag format

## v0.1.8

- chore(main): release 0.1.8
- fix(helm): correct image.tag comment to reflect actual format
- fix(helm): remove duplicate platform suffix from worker image tag
- fix: add sie-qdrant and sie-weaviate to release-please config
- fix: update README example to use new pool naming convention
- fix: correct worker image tag format to {version}-{platform}-{bundle}

## v0.1.7

- chore(main): release 0.1.7
- fix(readme): correct helm chart path
- fix(chart): update home URL and Helm install command in README
- fix: pool error types, add pool/progress test coverage
- fix(router): use effective_pool instead of pool_name for default pool GPU extraction
- fix: address PR #478 review feedback
- perf(florence2): switch OCR configs from beam search to greedy decoding
- fix(sdk): defer aiohttp session creation to fix "no running event loop" in SIEAsyncClient
- sdk: switch SIEAsyncClient from httpx to aiohttp
- feat(helm): default router to image-embedded model configs
- feat(helm): enable image pre-pull DaemonSet by default

