Skip to content

CLM v1.10.0

Choose a tag to compare

@github-actions github-actions released this 08 Jun 15:41
· 241 commits to master since this release
4e428a3

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, or RunnableParallel
    fan-out — which previously made such decks impossible to strict-replay. Opt back
    into vcrpy with CLM_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 an http-replay notebook, so a
    replay-free build never spawns mitmdump.
  • Dropped Python 3.11 support (requires-python is now >=3.12). mitmproxy,
    the new default replay transport, requires Python 3.12+; mitmproxy>=12,<13 is
    added to the replay extra. The Docker worker base images (drawio, notebook /
    notebooklite, plantuml) were bumped from python:3.11-slim to python:3.12-slim
    to match the new floor — on 3.11 pip install ./clm now fails the
    requires-python check.

Added

  • The [ml] extra now bundles deepagents>=0.6.0 and psycopg[binary]>=3.2.
    deepagents (create_deep_agent on LangGraph) backs the AI-Agents-II deck and
    psycopg is the PostgreSQL driver for the Docker/Postgres deployment decks, so
    installing [ml] (or [all]) makes those decks build out of the box.
  • clm slides sync honors the translation glossary on the new-slide path
    (follow-up to PR #264). The --glossary translation conventions — a style note
    plus a term glossary appended to the translation prompt — were wired into
    clm slides translate / bootstrap but not into the incremental clm slides sync add path, so a brand-new slide translated during a sync ignored the
    course's conventions. sync now 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 as clm-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 sync no 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 (git HEAD)
      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 no slide_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 run clm 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 new structural figure, 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.
  • clm slides translate's delegated-sync path now selects the glossary
    per-language too.
    When the twin already exists, translate degrades 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.
    The title role 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).