CLM v1.10.0
·
241 commits
to master
since this release
Changed
- mitmproxy is now the default HTTP-replay transport (issue #165), replacing
the in-process vcrpy path. The out-of-process proxy matches repeated and
concurrent identical requests that vcrpy's consume-once model mishandles — e.g.
a LangChain chain invoked many times with the same body, orRunnableParallel
fan-out — which previously made such decks impossible to strict-replay. Opt back
into vcrpy withCLM_HTTP_REPLAY_TRANSPORT=vcrpy. Cassettes are not
byte-compatible between the two transports, so existing vcrpy cassettes must be
re-recorded under mitmproxy before strict replay passes (vcrpy stays installed —
the mitmproxy addon serializes cassettes in vcrpy's on-disk format). Starting the
proxy is gated on the course actually having anhttp-replaynotebook, so a
replay-free build never spawnsmitmdump. - Dropped Python 3.11 support (
requires-pythonis now>=3.12). mitmproxy,
the new default replay transport, requires Python 3.12+;mitmproxy>=12,<13is
added to thereplayextra. The Docker worker base images (drawio, notebook /
notebooklite, plantuml) were bumped frompython:3.11-slimtopython:3.12-slim
to match the new floor — on 3.11pip install ./clmnow fails the
requires-pythoncheck.
Added
- The
[ml]extra now bundlesdeepagents>=0.6.0andpsycopg[binary]>=3.2.
deepagents(create_deep_agenton LangGraph) backs the AI-Agents-II deck and
psycopgis the PostgreSQL driver for the Docker/Postgres deployment decks, so
installing[ml](or[all]) makes those decks build out of the box. clm slides synchonors the translation glossary on the new-slide path
(follow-up to PR #264). The--glossarytranslation conventions — a style note
plus a term glossary appended to the translation prompt — were wired into
clm slides translate/bootstrapbut not into the incrementalclm slides syncadd path, so a brand-new slide translated during a sync ignored the
course's conventions.syncnow resolves a glossary too. Because sync is
bidirectional (a new EN slide flows to DE and a new DE slide flows to EN in
the same pass), it resolves the conventions per target language: a new EN
slide translated to DE uses the DE glossary, a new DE slide translated to EN
uses the EN glossary. Each is auto-discovered asclm-glossary.<lang>.md
walking up from the deck, or supplied explicitly with--glossary-de/
--glossary-en; a language with no glossary translates with no conventions, as
before. Batch (DIR) runs resolve one glossary from the directory root (the
translator is shared across the sweep). The glossary-discovery helpers are now
shared by both commands (clm.slides.glossary).
Fixed
clm slides syncno longer silently drops one-sided edits to shared /
id-less / header cells (Issue #269). Sync's promise is that editing one half
of a split deck carries all changes to the other half, and that it never
reports "decks already consistent" while a change was in fact dropped. Several
classes of edit violated that — each was silently lost, the run reported "0
changes — decks already consistent", and the watermark advanced over the
divergence (permanently baselining the loss). All are now propagated, or alerted
when they cannot be:- Language-neutral code/markdown cells on the first sync. The neutral-cell
drift diff ran only against a watermark, so the cold-start (gitHEAD)
baseline — the first sync of a freshly-split pair — missed a one-sided edit,
add, or removal of a shared cell entirely. The git-HEAD baseline now supplies
the shared-cell sequence, so cold-start syncs detect and propagate them (and
surface a both-sides divergence) exactly like the watermark path. - Id-less localized cells (a
lang=cell with noslide_id). A one-sided
body edit had no propagation direction, so it was dropped under both
baselines. A drift detector now feeds the structural pass a direction; both
bare statements (hash-anchored) and named constructs (def/class/import)
are re-translated onto the twin. A genuine both-sides id-less edit with no other
direction is surfaced rather than guessed. - The j2 deck header. A one-sided header edit (a retitle, or a should-be-
identical neutral arg) was reported "consistent". Sync still does not
auto-translate the header, but a one-sided change is now an error that holds
the watermark and tells you to update the other header (or runclm slides translate). - Honest reporting + fail-safe. The summary no longer says "0 changes —
decks already consistent" on a run that propagated a structural change (it names
the direction), the apply outcome counts a newstructuralfigure, and a
post-apply parity check errors if the two halves' neutral cells still differ —
so an un-propagatable shared-cell change can never be silently banked.
- Language-neutral code/markdown cells on the first sync. The neutral-cell
clm slides translate's delegated-sync path now selects the glossary
per-language too. When the twin already exists,translatedegrades to the
bidirectional sync engine; it previously applied the single target-language
glossary to both add directions, so a reverse-direction new slide got the
wrong-language conventions. It now resolves a per-language map there (parity with
clm slides sync); the cold-start bootstrap path is single-direction and
unchanged.- The dedicated deck-title translation prompt no longer strips terminal
punctuation. Thetitlerole prompt (PR #264) told the model to drop trailing
punctuation, which silently mangled a legitimately punctuated title (e.g.
header_de("Was ist neu?")→ "What's New?"). It now preserves the source title's
terminal?/!(while still forbidding the stray leading#/ quotes that were
the actual bug being fixed).