Skip to content

Update transformers requirement from !=5.13.0,<5.15,>=5.10.0 to >=5.10.0,!=5.13.0,<5.18 - #462

Open
dependabot[bot] wants to merge 39 commits into
mainfrom
dependabot/pip/transformers-neq-5.13.0-and-lt-5.17
Open

dependabot[bot] wants to merge 39 commits into
mainfrom
dependabot/pip/transformers-neq-5.13.0-and-lt-5.17

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 5, 2026

Copy link
Copy Markdown
Contributor

Updates the requirements on transformers to permit the latest version.

Release notes

Sourced from transformers's releases.

Release 5.17.0

Release v5.17.0

New Model additions

HYV4

Hy4-Preview is a 780B-parameter mixture-of-experts language model that activates 49B parameters per token. Each MoE layer holds 256 routed experts plus one always-active shared expert and routes every token to 8 of them. The context window is 1M tokens.

The architecture combines four features:

  • Multi-head Latent Attention (MLA) compresses keys and values into a low-rank latent (kv_lora_rank) that kv_b_proj expands back to one key/value per query head.
  • DeepSeek Sparse Attention (DSA) selects index_topk keys per query with a lightweight indexer. Following IndexShare, only the layers marked "full" in indexer_types run an indexer; "shared" layers reuse the previous full layer's selection.
  • Gated MLA with learnable attention sinks, where each head owns a sink logit that participates in the softmax and contributes no value, as in GPT-OSS.
  • Independent Hyper-Connections (iHC) replace the plain residual path with hc_mult parallel residual streams that are collapsed before, and redistributed after, every sublayer.

The implementation does not execute the multi-token prediction (MTP) layers. Released checkpoints keep those weights so that other runtimes can use them for speculative decoding; they are ignored at load time.

Links: Documentation

VibeVoice

VibeVoice is a novel framework for synthesizing high-fidelity, long-form speech with multiple speakers by employing a next-token diffusion approach within a Large Language Model (LLM) structure. It's designed to capture the authentic conversational "vibe" and is particularly suited for generating audio content like podcasts and multi-participant audiobooks.

Links: Documentation

NeoMME

NeoMME is a family of efficient 260M and 800M parameter multimodal-native multilingual foundation encoders from H Company. It processes multilingual text tokens and raw image patches in a single bidirectional Transformer encoder, without a separately pretrained vision tower or causal language model.

NeoMME-Retriever is a model fine-tuned from the NeoMME backbone for visual document retrieval with joint late-interaction and dense objectives. It takes text queries and documents (text or page screenshots) and produces multi-vector embeddings for MeanMaxSim scoring (late-interaction) and mean-pooled embeddings for cosine similarity (dense).

Links: Documentation

... (truncated)

Commits
  • 856157a v5.17.0
  • 5b7dcb0 MRoPE continued (#48594)
  • 50bbcc6 [fix] Update stale expected strings in HunYuanVL integration tests (#48646)
  • e8bcd79 [Quantizaiton]support 5/6/7 bits in AutoRound (#48481)
  • 3283d5f [fix] Update stale golden values and fix expected_logits shape in FlavaForPre...
  • 5f47b5a [tests] Fix integration test golden values broken by fast image processor def...
  • fc50134 Add Fun-ASR-Nano model (#46180)
  • d9fe823 Fix YOLOS device mismatch with device_map="auto" (#46886)
  • cbc1651 [Generate] Avoid unconditionally downloading remote hub file (#48620)
  • bd05a4b Honor shift_labels in decoder-only LLM/VLM losses (#48493)
  • Additional commits viewable in compare view

@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python Pull requests that update python code labels Sep 5, 2026
@dependabot
dependabot Bot requested a review from youssofal as a code owner September 5, 2026 10:32
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python Pull requests that update python code labels Sep 5, 2026
@youssofal

youssofal commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Thanks. Both bumps are covered on the branch for the next release: the darwin/arm64 requirement gets a 5.10.0 floor (the shipped venvs already run 5.14.1) and the lock moves to 5.14.1. Closing this in favour of that change once it ships.

ArctifoxNL and others added 22 commits September 15, 2026 15:26
…iles

SessionBankColdTier._cleanup_untracked_cache_once (cache_bank/cold_tier.py)
already reconciles the on-disk store against manifest.sqlite and deletes
whatever the manifest no longer references. It works; the gap is that it
only ever runs as a side effect of a write that finds the store close to
its configured size cap. On a Mac with generous free disk that cap is
rarely approached, so orphans a user never triggers the cap against just
accumulate forever: #493 measured 394,155 orphaned blobs (44.1 GB) against
17 live manifest entries after three weeks of normal use, with no CLI
command to reclaim them short of deleting the whole session bank by hand.

New module mtplx/session_bank_gc.py reimplements the same reconciliation
(entry dirs not in the manifest, blob files no entry's payload.json
references, evicted_entries/ leftovers) as a small, standalone utility
rather than importing SessionBankColdTier directly: cache_bank/cold_tier.py
imports cache_bank/codec.py, which imports mlx.core at module scope purely
for the tensor encode/decode path this reconciliation never touches.
Routing a disk-cleanup command through that import chain would mean
`mtplx gc` stops working exactly when it might matter most -- a broken or
absent MLX install -- contradicting the CLI's own "doctor and inspect run
on any machine" contract.

`mtplx gc` is read-only by default (reports what it would delete); --apply
is required to actually delete. Because a concurrently running server
writes new entries under a lock this reconciliation does not hold across
processes, --apply checks for a running server on the probed ports and
requires --force to proceed if one is found, matching the safety pattern
`mtplx stop` already uses for daemon discovery.

Tests: new tests/test_session_bank_gc.py (reconciliation correctness,
dry-run vs --apply, the running-server block and --force override). Full
existing suite green; CONTRIBUTING.md checklist (targeted tests, python -m
build, scripts/fresh_venv_smoke.sh) all pass; ruff check has zero new
findings versus the pre-patch baseline; verified mtplx.session_bank_gc and
mtplx.commands.public both import cleanly with mlx/mlx_lm blocked.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…aim at open, cap prices the whole store (PR #502 follow-up)

Issue #493, three reports of the same shape: 394,155 orphaned blobs (44.1 GB)
against 17 manifest entries after three weeks (taozhiyuai, M3 Max 128 GB);
471,541 blobs (67 GB) on a 60 GB --ssd-session-cache-max-size after three
days of uptime (nomishbhardwaj, M5 Max 128 GB); a third box clean. PR #502
(ArctifoxNL) added `mtplx gc` as a second, standalone copy of the
reconciliation so the command would import without MLX. This follow-up
keeps the contributor's command and tests and turns the copy into the one
implementation both sides use.

What was wrong on the engine side, read from the code:

1. The reconciliation (`_cleanup_untracked_cache_once`) ran only when a
   write found manifest + untracked + pending over the cap, or when a
   /health poll saw the store over the cap. A 100 GB default cap on a Mac
   with a big disk never reached either, so garbage accumulated forever.
2. After each cleanup the cap gate zeroed the untracked delta
   (`_note_orphans_cleaned`). But "untracked" is not only garbage: a blob
   shared by a later snapshot of the same conversation stays on disk when
   the entry that paid for it (physical_nbytes) is evicted, and its bytes
   leave the manifest SUM. Zeroing that delta blinded the gate to live
   bytes, and the directory could sit above the cap for good. That is the
   67 GB on a 60 GB cap.
3. The cleanup ran under _base_lock for the whole walk, on whichever
   thread priced the cap: the writer thread (only durability delayed) or,
   through spill_entry, the model-owner thread, where a 40 s walk of a big
   store is a 40 s TTFT for the next request. It also raced phase 2 of a
   write: blobs reach disk before their manifest row, and a pass that
   listed them would have deleted them.

What this commit does:

- `mtplx/cache_bank/reconcile.py` (git mv of the PR's
  `mtplx/session_bank_gc.py`) is the single walk: it reads the manifest,
  classifies every file (database, live entry, live blob, orphan entry dir,
  orphan blob, evicted_entries/, temp older than an hour) and, in delete
  mode, removes garbage per directory batch under an optional lock,
  re-reading the manifest when the store generation moved and honouring a
  `protected` set of in-flight entry dirs and blob digests. It is pure
  SQLite + filesystem; `mtplx/cache_bank/__init__.py` resolves the tier's
  names lazily (PEP 562) so `import mtplx.cache_bank.reconcile` never pulls
  the tensor codec and its `mlx.core`.
- The tier's measurement walk (`_scan_managed_disk_usage`) is that walk in
  dry-run mode, so the snapshot now carries orphan_file_bytes /
  orphan_disk_bytes / orphan_file_count next to the totals; the cleanup is
  the same walk in delete mode and installs the census it took (no second
  walk). The cap gate prices manifest + untracked (live drift and garbage
  alike) and never walks; garbage is reclaimed by
  `_reclaim_orphans_if_over_cap` before admission, inline on the writer
  thread, scheduled in the background from the owner thread, and bytes a
  running pass will free are not charged to the write that waits on it.
- Writes in flight are counted (`_claim_inflight` / `_release_inflight`,
  Counters under _base_lock): the writer claims its entry dir and every
  digest after planning, before the reclaim; the spill sink claims each
  digest before the blob exists. `_write_blob` re-creates a prefix
  directory a cleanup pruned between its mkdir and its write.
- The tier reconciles once at open when the store has content, in the
  background, yielding to foreground traffic every 4096 files and stopping
  on close(); a fresh store skips it. The summary goes to a
  `reconcile_listener` passed to the constructor (a small store finishes
  before any attribute set afterwards could be seen); the server wires it
  to a `mtplx_ssd_session_cache_reconcile` stdout event (the tier's
  logger.info lines never reach the daemon log: nothing configures Python
  logging). stats() carries it as `startup_reconcile`.
- `mtplx gc` keeps ArctifoxNL's surface (`--dir --apply --force --json`,
  refusal beside a running daemon without --force) and reports live
  entries and bytes on disk as well; --dir defaults to the saved config's
  ssd_session_cache_dir.

Tests (all run with the release venv, CPU only): tests/test_cold_tier_reconcile.py
(18, new: startup pass reclaims and reports, clean store reports nothing,
fresh store skips, off tier never touches the store, in-flight claims
survive a pass, a row committed during the pass keeps its blobs, dedupe
drift stays priced after a cleanup, the writer reclaims before evicting
live entries, the owner path schedules and never walks, a running pass's
bytes are not charged, the delete pass installs its census, stale vs fresh
temps, pruned prefix directory, interrupted walk is stale, CLI report
totals); tests/test_session_bank_gc.py (11, the PR's, re-pointed);
tests/test_no_mlx_imports.py (+1: reconcile import and `mtplx gc` dry run
and --apply --force with mlx blocked); tests/test_cold_tier_stats_cache.py
(waits for the cold-start census before counting; its two manifest reads
raced the count and the race is what a slightly longer walk exposed).
Existing suites: test_cache_bank, test_cold_tier_disk_usage_scan,
test_cold_tier_*, test_ssd_spill, test_ssd_boundary_repersist,
test_cold_prefix_ram_shadow, test_session_bank, test_session_bank_env_caps:
146 passed. Ruff: no new findings on any touched file (cold_tier net -1).

Docs: docs/server.md gains "SSD session cache (cold tier) limits" next to
the MTPLX_SESSION_BANK_* table (the cap's meaning, the effective cap, the
startup pass, the event, `mtplx gc`); CHANGELOG [Unreleased] Added (PR
#502, ArctifoxNL) and Fixed (#493); docs/releases/v2.11.3.md Session cache.

Not measured here: the walk on a 400k-file store (the 2026-08-15 receipt
is 41.7 s for 816k files; this pass does the same stat work plus unlinks).
…AR-only sources out of speculative Forge
…ssions (>100k tokens) in RAM and SSD tiers
… MTP evidence (PR #489 follow-up)

PR #489 (Philip John Basile) merged as 0533de4: compatibility_for_inspection
uses _trunk_weights_present (local dir or remote listing) instead of a local
glob, so nex-agi/Nex-N2.5-mini inspects as an AR-only runnable checkpoint;
_probe_runtime_mtp_evidence no longer treats can_run as MTP evidence, so
Forge refuses AR-only sources with guidance that says it cannot create a
head. tests/test_artifacts.py + tests/test_forge_cli.py: 182 passed on the
release venv. Ruff: no new findings (registry.py 7->7, forge.py 44->44).
This commit adds the CHANGELOG [Unreleased] Fixed entry and the release
notes mention; no code.
…llbacks restored (PR #496 follow-up)

PR #496 (Dizzler7, merged as 623c8cb) raised four numbers to let a 12.2 GiB
Q8-KV 100k-token Qwen3.8-27B snapshot persist: DEFAULT_PER_SESSION_MAX_BYTES
8 -> 32 GiB and DEFAULT_MAX_BYTES 24 -> 48 GiB (session_bank.py), the
>=96 GB tier ceiling 24 -> 32 GiB (engine_session.py), the 64 GB Mac SSD cap
32 -> 100 GiB when >= 150 GiB of disk is free, and the hourly SSD write
budget 64 -> 128 GiB.

Checked against the plan for a 64 GB seat (usable 48 GiB, 27B weights
18.6 GiB): a flat 32 GiB per-session snapshot plus its restore copy is
64 GiB next to 18.6 GiB of weights; that is swap death, and #150
(ArthoPacini) is the receipt for a 15 GiB gate on that seat. The plan already
sizes the bank per machine (resolve_session_bank_max_bytes takes
memory_plan.bank_idle_max_bytes); only the per-session ceiling was still a
flat RAM-tier constant.

This commit keeps the contributor's SSD changes and replaces the flat RAM
caps with the plan:

- per_session_play_ceiling_bytes(plan) = max(1 GiB, (usable - weights -
  RUNTIME_TRANSIENTS) / 2): one conversation's snapshot must fit twice in
  the play (the restore materializes it next to the banked copy).
  resolve_session_bank_per_session_bytes takes memory_plan and uses that
  ceiling in auto mode; without a plan the RAM-tier ceiling applies as
  before. Seats: 64 GB + 27B 13.2 GiB (the report's 12.2 GiB snapshot
  fits), 128 GB + 27B 32 GiB (the PR's number, where the plan has room),
  128 GB + Flash-Next 10.5 GiB (below the old flat 24), 48 GB + 27B 7.2 GiB.
  EngineSessionManager passes its memory_plan through.
- DEFAULT_MAX_BYTES back to 24 GiB, DEFAULT_PER_SESSION_MAX_BYTES back to
  8 GiB, _HIGH_MEMORY_PER_SESSION_MAX_BYTES back to 24 GiB: these are the
  fallbacks for a machine whose RAM cannot be detected or that has no plan,
  the one machine we know nothing about.
- Kept: default_cold_tier_max_bytes 64 GB tier -> 100 GiB with >= 150 GiB
  free (the effective cap is still min(cap, free/4) at write time, so it
  matters on disks with >= 400 GiB free; the app passes "auto" for the cap,
  which parse_size_bytes maps to this default, so the tier is live for app
  users; `mtplx serve` passes its literal 100GB), and
  MTPLX_SSD_WRITE_BUDGET_PER_HOUR default 128 GiB.

Tests: tests/test_engine_session_env.py (+6: the four seats, the ceiling's
guards, explicit env over the plan), tests/test_cold_tier_defaults.py (new,
5: tier cap on a tight disk, with 150 GiB free, unreadable disk, smaller
tiers, write budget default). Ran test_engine_session_env,
test_session_bank_env_caps, test_cold_tier_defaults,
test_cold_tier_write_budget, test_memory_plan: 126 passed. Ruff: no new
findings. Docs: docs/server.md per-session row and SSD rows; CHANGELOG
Fixed (PR #496, Dizzler7); release notes Session cache.
…ow-up)

per_session_play_ceiling_bytes caught Exception around an import and two
attribute reads; ruff BLE001 flagged it as the one new finding on the file.
It now catches ImportError, TypeError and ValueError, which is all that
path can raise. tests/test_engine_session_env.py: 55 passed.
…s never persisted (issue #503)

Issue #503 (bjornnelson76, app 2.11.2 build 2011020): after a hard freeze
the daemon's listening socket survived while /health stopped answering.
PortPreflight.classify maps a probe timeout to .foreign, the #409 settle
window is for a draining daemon and cannot expire a wedged one, and
preflightConfiguredPort's foreign branch moved the app to the next free
port AND saved it to settings. Every client pinned to the configured port
(a Hermes connector on 8001) was stranded for good while the engine showed
Running; recovery took a full Stop and a manual port reset.

Fix, app side (MTPLXAppCore):

- PortPreflight.appOwnedListener(port:) asks the OS who holds the port
  (/usr/sbin/lsof -t, bounded by the existing SubprocessWatchdog) and
  whether that process carries the app's own launch marker:
  DaemonSupervisor.appLaunchID(ofProcess:) generalizes the exact-match
  reader over the kernel's argv/env image (KERN_PROCARGS2; never ps text,
  so an argument containing the token cannot pass as ownership).
  waitUntilBindable polls the bind after a reap.
- preflightConfiguredPort .foreign: an app-owned listener is reaped in
  place through terminateExternalDaemon (whole process family) and the
  configured port is kept; the lookup runs off the main actor. A listener
  without the marker (a stranger's app, a CLI mtplx serve) is never
  signalled.
- A fallback is never persisted: applyPortFallback changes only the
  in-memory port and records (configured, fallback); every settings write
  goes through persistConfiguration, which writes the configured port back
  while the launch runs on a fallback unless the user changed the port on
  purpose (that ends the fallback); the next user-initiated start restores
  the configured port and clears the banner. remediatePortConflict's
  invisible-collision path uses the same helper. New banner copy in all 13
  language tables.

Fix, CLI twin (SYNC PAIR comment in PortPreflight.swift):
daemon_client.describe_foreign_listener (lsof + process_app_launch_id over
KERN_PROCARGS2 through ctypes) and port_busy_advice(listener=); the
quickstart's configured-port path names the pid and says it is a daemon the
app launched that stopped answering, with the fix, instead of "another
app". The CLI names it and leaves the process alone.

Tests: swift test --filter '(testPreflight|testPortPreflight|testPortFallback)|LocalizationTableTests':
24 passed, 0 failures, 48 s including the build (new:
testPreflightReapsWedgedAppOwnedDaemonAndKeepsConfiguredPort with a python
listener that accepts and never answers, spawned with the marker;
testPreflightNeverReapsAWedgedListenerWithoutTheLaunchMarker;
testPortFallbackIsNotPersistedAndLaterSavesKeepTheConfiguredPort; the two
existing fallback tests now assert nothing is persisted).
DaemonSupervisorTests not run (fan state). No app bundle built or launched.
tests/test_daemon_client.py 29 passed (+2); tests/test_public_cli.py -k
"port or quickstart" 35 passed. Ruff: no new findings on daemon_client.py,
public.py, test_daemon_client.py. CHANGELOG Fixed (#503); release notes.
…l, request-log wall clock and draft totals test (#401)
…cross rewritten turns, with the two exactness follow-ups from 2026-09-09
…irectories, with the 2026-09-09 follow-ups (localization, unmounted-root explanation, doctor roots)
…s slow phase (issue #487)

HenriGrimm's flight log shows the app reaping a live daemon four times in
one day: each time the daemon was inside a generation-final prefix commit
that took 19-25 s on a 110-150k vision agent session, answered nothing on
/health for that long, missed two probes in a row and was killed while the
commit it was doing succeeded (stored: true). From the client's seat the
model "randomly crashes between turns at high context".

Two defects, both fixed here (the work was done on the 2026-09-09 branch
ov-487-20260909 and is applied onto the integration line with its three
conflicts against PR #283's restructured commit resolved by hand):

1. The watchdog treated two missed probes as death. It now gathers process
   and port evidence (kill(pid, 0) on the daemon's own pid, a TCP connect
   to its port) before reaping: a daemon whose process is alive and whose
   port still accepts connections is "busy", never dead, and is reaped only
   after 90 s of unbroken silence, or the moment its process is gone or its
   port closes. The single-failure paths (a refresh that timed out, a chat
   stream that lost its connection) go through the same gate instead of
   reaping on one failed request. DaemonLivenessPolicy.swift holds the pure
   decision (11 tests); the store publishes daemonUnresponsiveFor so the UI
   can say "busy" instead of "offline".

2. The commit itself was slow for a reason the log could not name: a prompt
   whose screenshots together exceed the vision embed cache's row budget
   evicted its own images on the way through, so the commit's second walk
   over the same images re-ran the tower for every one of them on the
   model-owner thread. The images of the prompt being materialized are now
   pinned for the pass (the cache may exceed its budget by at most one
   prompt's rows, which are resident in that prompt's KV anyway), the cache
   is mutated under a lock, and the commit records the wall of every phase
   (history flatten, canonicalize, committed decode, render/encode, vision
   splice, compat, lock wait, bank metadata, put) in the pc flight event so
   the next slow commit names its phase.

Tests: tests/test_server_obs_postcommit_health.py (6: phase receipts,
/health answers while a commit holds the model lock, pinned images survive
their own eviction pass); tests/test_openai_bridge.py and
tests/test_gemma4_session_cache.py green after the conflict resolution.
…y stays the default

Overnight 2026-09-16 A/B on the founder's own workload (the 88-character
flappy prompt at effort xhigh, uncapped, native sampler, Flash-Next
Optimized Speed, alternating boots under verified max fans, same venv):

  arm  tree                    tokens  tok/s  tokens/round  acceptance by depth
  R1   2.11.2                  44,876  66.5   3.02          0.83 / 0.67 / 0.53
  B1   line, block verify on   50,797  64.9   2.90          0.80 / 0.62 / 0.48
  B2   line, block verify on   45,040  63.7   2.91          0.80 / 0.62 / 0.48
  R2   2.11.2                  50,115  62.6   3.00          0.83 / 0.66 / 0.51
  V0   line, block verify off  46,117  66.8   3.00          0.83 / 0.65 / 0.52
  P0   line, block+opdiet off  56,285  65.9   2.98          0.82 / 0.65 / 0.51

The exact block law accepts 3.5 percent fewer draft tokens per round than
the standard verify on this workload, on both arms that ran it, and the
whole-turn speed follows. The 2026-09-08 receipt on an 8,848-token code
prompt was a tie (407/364/323 against 408/361/324 of 441 drafts), which is
why the lane was stamped on; the reasoning-heavy turn is the workload
users actually run at xhigh. Both laws are distribution-exact, so the
faster one is the default: MTPLX_QWEN4_BLOCK_VERIFY is no longer stamped by
the server's Flash-Next lane defaults and is honoured when exported. The
law fix and its enumeration test stay; anyone opting in gets the exact law.

tests/test_env_flag_parsing.py: the key leaves the stamped-on list, the
Bare-Speed shape asserts it absent, and an explicit export is carried.
Release notes and changelog say what was measured and what the default is.
…ng the main actor (issue #487 follow-up; the release build refused the actor-isolated access)
…all-detection QA test pins its library to the temporary root

Two test-target fixes found by running the Swift suite on the integration head:

- DaemonLivenessPolicyTests (issue #487 port) called bind(fd, ...) inside the
  test class, where Swift resolves the name to an instance method and refuses
  to compile the target; Darwin.bind names the socket call.
- testModelInstallDetectionCanBeDisabledForFreshUserQA asserted the explicit
  temporary candidate through the default library. With the ordered library
  search of PR #387, a Mac that has the same pack installed in its default
  library answers with that copy first, so the test read the machine instead
  of the code. It now builds a ModelLibrary rooted at its temporary directory
  and asserts through installedLocalPath(in:) / resolvedReference(in:), the
  same way ModelLibraryTests already do.
…09-16 receipts

Full Python suite (6,938 passed, 33 skipped) and Swift suite (965, 0 failures);
OpenCode and Pi multi-file projects on 2.11.2 and on this line (ten steps each,
all exit code 0, every follow-up a session-bank hit); the founder's flappy
workload over seven alternating boots (this line's default 66.8 tok/s against
66.5 / 62.6 on 2.11.2; the exact block-verify lane opt-in at 2.90 tokens per
round against 3.00-3.03); the candidate app 2011042 driven through its own
daemon for three turns (54,460 tokens at 61.7 tok/s on a 91-100 C chip, a
54,530-token restore in 4 ms, a 96,760-token restore in 8 ms); exactness on
both packs scored by exact token ids (partings at 0.000-0.250 nats, sampled
distributions within the AR split-half control, a warm restore equal to cold
up to a literal coin, padding rows never surfacing).
…son (issue #499)

On a 48 GB memory plan a 142k-token turn on the 27B produces an 11 GB
snapshot against a 7.4 GB per-session cap (reproduced 2026-09-16,
outputs/overnight-20260916/runs/repro499). The bank refused it, a plain
client got no SSD copy, and the following turn reported the cold tier's
ssd_prefix_miss, which only says the SSD had nothing either; the bank's own
docstring already named that masking.

The bank now records the refused put per session (prefix length, token
hash, size, cap) and, when a later restore of that conversation misses in
RAM and on the cold tier, reports oversized_snapshot_skipped as the miss
reason; the record is exposed as last_oversized_skip in the bank's health
dict. Another conversation in the same session is not blamed. Pinning
test added; the full suite is 6,939 passed / 33 skipped on this tree.

The refusal itself (an SSD write-only spill for oversized snapshots and a
restore that rebuilds the draft head's history over the restored trunk)
is the 2.11.4 item named in the release notes.
…SD-restart restore and the KL-vs-bf16 pack figures
youssofal and others added 17 commits September 16, 2026 14:34
…ht defects as a table, every figure kept

Same facts as the previous draft, restructured for readers: a short lead, a
before-and-after headline table against 2.11.2 (9k context +27 percent,
the 8,848-token receipt +12 percent, the 45k-56k-token reference workload
a tie, agent sessions +3 percent, acceptance by depth, 261k context, the
32 GB draft head, the Hindi/Thai/Arabic token counts, the Hermes token
seam, the OpenCode reply budget, the SSD store), the eight exactness
defects as a numbered table with what each did and how it was fixed, the
eight speed arms and the 9k lane A/B as tables, spaced bullets per area,
the validation section as a table plus the exactness receipts side by
side for both packs, and the #499 known limitation and the upgrade note.

Checked mechanically against the previous draft: every issue and PR
number, every MTPLX_* flag and every figure of the old text is present in
the new one (the three tokens that differ are restatements: 45,000 as
45k to 56k, 5,835 as 2,957 + 2,878 per pack, 8.8k as 8,848). No em
dashes, no idioms, full sentences. Three bullets were tightened from
their commit bodies: the non-finite floats on the dashboard stream (the
MTPLX_SESSION_BANK_IDLE_TTL_S=0 case), the #468 first-line hold, and the
#472 connect opencode behaviour. The Python suite count is the final
head's log (gates/pytest-full-2.log: 6,939 passed, 33 skipped).
Written in the main worktree by the September sessions and never
committed: the heredoc-after-a-pipe trap, the ten-minute-bound phase
chain, the QA app instance adopting the founder's daemon on a shared
port, the pgrep self-match, the A/B flip during an idle postcommit, the
27B thermal throttle read as a policy effect, build-and-run.sh's kill
sweep, cua-driver Cmd-Q on an app it did not launch, the running zsh
runner edit, the pipe-to-tail boot hang, the release-notes claim of a
setting the wrapper rejected, restoring fans to auto over a max-fan
daemon, and zsh set -- on an unquoted variable. Filenames are the index,
as the ledger protocol says.
Retire cache entries under short lock sections, then reclaim their blobs in a single paced pass. The SSD writer pauses outside the store lock when a request arrives, while an owner-thread spill yields back to its scheduler. Recheck manifest generations and in-flight references before deleting each bounded batch, and recheck the admission budget after yielding.

The arrival regression fails against the previous release candidate and passes with this change. Cache coverage also checks lock availability, shared blobs, concurrent references and spill interruption. No sampler, model, or client protocol changes.
Describe the shared server fix and its behavior across the native app, OpenCode, Hermes and Pi. Real two-turn coding checks passed in OpenCode CLI and Desktop, Hermes and Pi; the native app completed the original five-turn sequence. Controlled sampled A/B follow-ups with eviction active averaged 61.2 versus 65.9 tok/s with identical outputs and flat peak memory. This is not a guarantee that every prompt exceeds 50 tok/s.
…l suite count, the 2011044 candidate QA

The eviction bullet now carries what was observed (a 66-entry eviction
running about 89 seconds alongside two app replies at 33.5 and 42.3
tok/s, with the caveat that the eviction's share of that slowdown was not
quantified), what changed (short lock sections, one paced reclaim pass,
generation check before deletion, protected shared and in-flight blobs,
owner-thread spills yielding to their scheduler), the regression test,
and the controlled A/B receipt (61.2 to 65.9 tok/s, +8 percent, against
the same build without the fix, identical output, alternating boots,
fans verified). The validation table names the final code's suite count
(6,942 passed, 33 skipped) and notes that the fix touched no Swift code,
and a paragraph records the second candidate bundle 2011044 driven
through the native app, OpenCode, Pi, Hermes and OpenCode Desktop.
Figures from outputs/ssd-eviction-20260916 (arms B3, C3, B4, C4,
client-summary.json, REPORT.md).
Install a small plugin package with the legacy V1 entrypoint and a server entrypoint exposing both V1 server() and V2 setup(). Keep older V1 hooks and register only a provider-scoped model.request header hook in V2. Migrate the managed plugin registration while preserving unrelated plugins. The real 1.18.29 and 2.0.5 clients both emitted MTPLX session headers; focused tests cover both entrypoints and unchanged V1 sampler/cap handling.
Capture per-second flight, thermal, memory and optional GPU evidence without repeating an entire coding-agent task. Require an explicit diagnostic token budget and verified actual max fans; preserve captured prompts and sampling settings.

Record the confirmed verify-cost slowdown, the inconclusive tuning experiments, measured 200k decode results, and real OpenCode V1/V2 validation. Keep the intermittent performance defect open rather than claiming an unproven decoder fix.
Stop the native app and CLI agent presets from overriding model-owned distribution evaluation and verify width. The legacy lazy-target pin disabled Flash-Next batching, while the lazy-bonus pin shortened D3 to three rows and bypassed fixed-M4 compilation when used alone.

Calibrate recurring draft and verify costs during the existing four-sample warmup before applying the EWMA. A restored compiled call took 125 ms once and 31 ms thereafter, but the previous estimator kept selecting slower eager D2 for hundreds of cycles.

Add regressions for client/profile composition, the startup spike and later sustained slowdowns. Controlled 109k ABBA improves from 48.83 to 61.77 tok/s (+26.5%) with flat memory; 200k candidate runs hold near 50 tok/s. Keep native sampling, context, cache budgets and explicit operator overrides unchanged.
Canonicalize JSON object keys in declared tool schemas while preserving every field, value and array order. The native app randomized schema key order between requests, invalidating an entire 19k-token prefix and adding 14 to 15 seconds of prefill.

Separate prompt tool declarations from permission to emit calls. A tool_choice none completion keeps the same schema and cache identity, while the existing suffix instruction and output handling still disable calls. Apply the same prompt shape to postcommit and Anthropic token counting.

Add regressions that fail on the baseline for JSON ordering and auto/none transitions across app, OpenCode, Pi and Hermes. The focused server, cache, postcommit and observability suite passes. Real-model before-and-after validation is in progress.
Native web-chat QA caught a remaining 2.8-second follow-up: generation-final snapshots included the closing instruction that the app never sends back, invalidating the generated answer as a prefix.

Capture the history before appending turn contracts and register both disabled-tool suffixes for exact prefill boundaries. Preserve the instruction during generation and preserve user-authored history. Both regressions fail before this change; 480 server, cache, postcommit, tokenizer and protocol tests pass.
…t QA

Document the three prefix defects, the original 14.7-second receipt, matched 19k ABBA, the native post-tool follow-up at 0.291 seconds and the original chat at 0.277 seconds. Preserve cold-refill, background-postcommit and existing app-compaction costs so the results are not presented as a universal latency floor.

Record 480 passing tests, real app/OpenCode/Pi/Hermes artifacts, signed build 2011048, runtime backups and unchanged launcher paths. Mark an unused test binding after the changed expectation; all pre-existing lint findings remain outside this scoped repair.
…irs, OpenCode 2, and the suites rerun on the final code

The three fixes that landed after the SSD eviction repair are in the notes and the changelog with their measured figures: the 19k-token chat replay (15.26 to 0.57 s and 13.93 to 0.66 s to the first token), the 108,919-token OpenCode turn (48.83 to 61.77 tok/s, four alternating runs), the OpenCode 2 plugin package, the upgrade note on the one-time prefill, and the known wait on the post-tool background commit. Validation rows: Python 6,959 passed, 33 skipped, 0 failures and Swift 965 tests, 2 skipped, 0 failures, both rerun on 436d071; the 2011046 and 2011048 candidates.
…tion stamped 2.11.3

The notes read as a person wrote them: internal words (lane, arm, receipt, law, gate, die, seat, primary, canonical) replaced with plain ones, the longest sentences split, table headers renamed to Run and Version, every number and reference unchanged. The changelog heading moves from Unreleased to 2.11.3 dated 2026-09-17.
Updates the requirements on [transformers](https://github.com/huggingface/transformers) to permit the latest version.
- [Release notes](https://github.com/huggingface/transformers/releases)
- [Commits](huggingface/transformers@v5.10.0...v5.17.0)

---
updated-dependencies:
- dependency-name: transformers
  dependency-version: 5.16.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot changed the title build(deps): update transformers requirement from !=5.13.0,<5.15 to !=5.13.0,<5.17 Update transformers requirement from !=5.13.0,<5.15,>=5.10.0 to >=5.10.0,!=5.13.0,<5.18 Sep 17, 2026
@dependabot
dependabot Bot force-pushed the dependabot/pip/transformers-neq-5.13.0-and-lt-5.17 branch from 7609f21 to 00ece72 Compare September 17, 2026 05:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file python Pull requests that update python code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants