Repository navigation
Concurrent agents on one server stop stepping on each other. Several agents sharing
an MCP server (Claude Code subagents share their parent session's) could only
separate their work with use_workspace, whose selection is server-wide, so one
agent's switch quietly retargeted every other agent's calls. Each call can now name
its own workspace. Two FEM changes ride along: a default mesh-size floor that stops
sliver edges in imported CAD from exploding a mesh, and a ccx working directory per
worker so concurrent workspaces no longer share one.
Windows gets the Linux-only solvers. OpenFOAM, FSI, molding, YADE, openEMS and Bempp
now run from the prebuilt solver image through Docker inside WSL, set up with one
command, where they previously needed hours of source builds. A saved .FCStd can
also carry the record of the session that built it.
Added
- Every tool takes an optional
workspaceargument. It pins that one call to the
named workspace (created on first use) without changing the server's current
selection, and the session journal records the workspace the call actually ran in.
On a shared server each concurrent agent should passworkspace=<name>on every
call;use_workspaceremains for a single agent and is server-wide. See
docs/MULTI_AGENT.md§7 (#483). fem_meshtakesmin_length(mm), the smallest element size Gmsh may use, and
returns the value it applied (#483).- Linux-only solver families run on Windows from the prebuilt image. Under the
containersubstrate every engine call is relayed throughwsl -d <distro> -e docker, with%TEMP%and host paths translated into the container.
ankusdrive container setup [--install-engine]installs the engine, pulls the
image, starts the container and writes the substrate toconfig.toml, anddoctor
offers it for Linux-only families on Windows. Seedocs/WINDOWS.md(#470). save_documenttakesattach_provenance(defaultFalse). The saved.FCStd
then carries thejournal_exportrecord for the calls that built that document:
replay script, environment and solver identities, and a SHA-256 for each result.
Read it back withankusdrive journal export file.FCStd. A save without the flag
drops an earlier record.ANKUSDRIVE_JOURNAL_REDACTapplies as it does to the
journal (#462, #474).
Changed
fem_meshnow floors the element size atchar_length/10by default. A call
that passeschar_lengthgetsCharacteristicLengthMin = char_length/10where it
previously got FreeCAD's floor of 0, so a mesh of the same body can come out with
fewer, larger elements around small features. Passmin_length=0for the old
behavior. Amin_lengthlarger thanchar_lengthis rejected
(#483).fem_run's default workdir is<TMPDIR>/ankusdrive_fem_<pid>, keyed by the
worker's process id, instead of a single shared<TMPDIR>/ankusdrive_fem, so
concurrent workspaces cannot write decks and results into the same directory. A
workdiryou pass is used as before. A worker removes its own default workdir
when it exits, and its first default solve sweeps those left by killed workers
(dead pid and untouched for an hour);ANKUSDRIVE_KEEP_SCRATCH=1keeps them
(#483,
#487).list_workspacesandclose_workspacereport the pinned workspace.current
is the workspace the call ran in (itsworkspacepin, else the server-wide
selection), and a newselectedfield gives the server-wide selection. Closing a
pinned workspace leaves the server-wide selection alone
(#487).dem_pack_submit'sin_bandgates the bulk packing fraction. It compared the
whole-bed fraction, deflated by the loose wall and free-surface layers, against the
0.60–0.66 random-close-packing band, so the default run reportedin_band: false
at a bulk fraction of 0.602. The bulk fraction is gated when the runner can define
an interior cell, and the result reportsgated_onandgated_fraction
(#471, #472).- The default toolsets' longest docstrings are shorter: the default bundle's
tools/listis about 124,000 characters, down from 139,099 against a 140,000
budget. No argument's meaning changed (#459, #473). - The examples live in one
examples/tree (design/,optics/,simulation/);
example/is gone (#478, #479).
Fixed
- DEM works on Windows with YADE installed inside WSL. An in-distro YADE was
discovered and then launched as a native Windows process, sodemreported absent
whatever was installed. It now launches throughwsl -d <distro> -e, and a
symlinked binary in the distro is no longer declared missing
(#463, #467). - A wheel install (pipx, uv tool, venv) no longer breaks FreeCAD's Qt. The host
venv's PySide6 and numpy shadowed FreeCAD's own ("DLL load failed while importing
QtCore"); FreeCAD's bundled packages now win.doctorwarns when the venv's Python
differs from FreeCAD's (#468, #469). - The session journal records tool calls rejected at argument validation, and
unknown tool names, asrejected: true. Before, those calls were missing from both
session_transcriptand the durable journal. The durable journal's FreeCAD
identity now includes the build hash (#457, #458,
#475). - Under
container, a stale FSI override (ANKUSDRIVE_CCX_PRECICE, the FSI bashrc)
is reported by name with the path the image publishes. Before,doctorcalled FSI
ready and the override silently fell back to another variable
(#460, #476).