Repository navigation
Releases: gchen19/AnkusDrive
Release list
0.5.6 — an auditable result, and a Mac as a real solver host
The release that makes a result auditable and a Mac a real solver host. Every tool
call is now journalled, so a session can be exported as a Python script that
regenerates the model and its simulations. The script checks every number a solve
reported, names the exact solver binary and version that produced it, and diffs the
input deck the solver was handed. With one setting the journal also goes to disk,
where it outlasts the session. On macOS, YADE, Elmer, openEMS and Bempp now run
through the container substrate alongside OpenFOAM. That container is a new
runtime-only solver image, about a fifth of the CI image's download, signed and
scanned, and it records which solvers it contains so doctor cannot report a missing
one as ready. There is also a new explicit impact solver and one checked against an
exact closed-form answer, CalculiX that no longer blocks the MCP channel, and fixes to
STEP export and to the openEMS gate that change what a user gets back.
Added
- Session journal and
session_transcript. Every MCP tool call is recorded in
memory with its full arguments and a trimmed result.session_transcriptreturns the
session as a Python script that regenerates the model, drawings and simulations
through the same tools in a fresh worker. Handles become variables, job polls
becomes.wait(job), and absolute paths becomeWORKDIR-relative. Inspection
calls are dropped unless a later call used them, but analysis calls (hand calcs,
FEM, every*_submit) never are. Each analysis result is checked whole: every
number becomess.check, and its verdict fields (fidelity, correlation, solver,
gate pass) becomes.expect. A replay that reaches a different solver therefore
stops at that step rather than returning a plausible figure. The script opens
with aPROVENANCErecord (AnkusDrive, FreeCAD, platform, substrate, and every
solver the session reached with its path, substrate and probed version).
s.provenance()re-resolves that record on the replaying machine and prints what
moved.run_scriptcode is carried verbatim with its SHA-256
(#407,
#408,
#409,
#410,
#433). - Durable journal and
journal_export, opt-in.ANKUSDRIVE_JOURNAL_DIR(or
journal_dirin config.toml) writes one JSONL file per session: an environment
header, then one line per call with a SHA-256 of the full result. Old files are
removed oldest-first past 50 files or 512 MB, never the live session's file.
ANKUSDRIVE_JOURNAL_REDACT=1hashes paths and names, but neverrun_scriptcode; a
redacted journal can be checked but not replayed.journal_exportand
ankusdrive journal list|exportturn a past session's file into the same record
session_transcriptgives. Off by default
(#433). - Every solve records the deck it was handed. A job snapshots its case (file
list plus per-file SHA-256) when its first solver step launches, and the result
carries it asdecknext tocase_dir. On replay,s.deck(...)reports whether the
input matched, so a drifted number is attributed to the problem or to the solver
(#437). - Impact dynamics:
impact_dynamics_submit(a CalculiX*DYNAMICpenalty-contact
solve) andbar_impact(the closed form). They are gated against St-Venant's exact
elastic bar striking a rigid wall (face stressρ·c₀·v₀, contact time2L/c₀,
rebound at the strike speed) and against the plastic-wave cap past yield. This was
the last unbuilt row ofdocs/SIMULATION_NEXT.md
(#311). fem_run_submitruns a CalculiX solve as a background job, so a long FEM run no
longer blocks the MCP channel.fem_runstays for solves that take seconds
(#308).- YADE, Elmer, openEMS and Bempp run through the container substrate
(ANKUSDRIVE_SUBSTRATE=container), probed inside the running container with no
exports needed. On a Mac this brings DEM, every Elmer family, full-wave EM and
acoustic BEM in with onedocker pull
(#419). ghcr.io/gchen19/ankusdrive-solvers, a runtime-only solver image for the
container substrate: 0.88 GB compressed on arm64 and 1.15 GB on amd64, against 4.5 /
5.3 GB for the CI image. Tags::latest/:fullfor every solver, and:openfoam
for OpenFOAM alone.tools/build_solver_image.sh --solvers "…" --from-published
builds any other set in minutes with no compile. Every image writes
/etc/ankusdrive/solvers.json, and discovery reads it first, so a solver an image
leaves out is reported as "this image does not include …", never as ready
(#422).- Signed, scanned solver images. Both images carry Sigstore build provenance and a
CycloneDX SBOM, and are scanned for secrets and fixable critical CVEs.
scripts/verify-container-image.shandankusdrive doctor --verify-imagecheck an
image against this repository's workflow.doctoralso reports a container that
runs with more privilege than the documenteddocker rungrants
(#423). scripts/install-solvers.sh elmersource-builds a pinned Elmer on Linux (including
arm64, which has no package) and on macOS
(#384).pocketandholeacceptstrict=True, which escalates their "removed everything"
and "removed nothing" warnings to errors, asboolean_opalready did
(#287).solve_capabilitiesreports the case root, with its live size and the retention
policy (#437).
Changed
- Solver case directories live under one root with a stated retention. Cases are
written to<system temp>/ankusdrive-cases(ANKUSDRIVE_CASE_ROOTmoves it). Past
64 directories or 4 GB, the oldest are removed first, but never one written in the
last hour (ANKUSDRIVE_CASE_KEEP/_MAX_GB/_GRACE_S;
ANKUSDRIVE_KEEP_SCRATCH=1keeps everything). A directory you pass in is never
touched. Directories left loose in the system temp dir by earlier versions are not
moved or cleaned up
(#437). - Under the container substrate, an override the container cannot use is now
reported instead of replaced. A staleANKUSDRIVE_ELMER_PATH,ANKUSDRIVE_YADE,
ANKUSDRIVE_OPENEMS_PYTHONorANKUSDRIVE_BEMPP_PYTHON, or a host install's path
in config.toml, now leaves that family not ready. The hint names the variable and the
image's own copy that clearing it would give. Checkankusdrive doctorafter
upgrading if you moved a Mac from a native or Multipass setup
(#443,
#422). em_fullwaveis gated on the solved field. The documentedfc_ratiogate never
read the FDTD field: openEMS computes the port'sbetaanalytically, so even a
truncated run passed. A newalpha_ratiogate fits the solved field's decay below
cutoff against the exact value, and the dipole mesh is now resolved finely enough
for its resonance to be meaningful
(#398–#403).docs/SOLVERS_MACOS.mdanddocs/MACOS.mdno longer call the container-reachable
families unavailable, and recommend the solver image over the CI image. The macOS
Gatekeeper caveat is retired: a server Claude Desktop launches from a never-run,
notarized FreeCAD passes without a dialog, anddoctordiagnoses a blocked boot
(#310,
#432).
Fixed
- STEP/IGES export of an assembly wrote an empty file and reported success.
Exporting anApp::Part(links or plain features) produced 1,640 bytes with no
faces, andrelease_packageshipped that to vendors. The resolved shape is now
exported, and an export with no geometry is an error
(#434). export_shapewith noobjectexported the first shape in the document (after a
cut, the consumed base) instead of the final one. It also crashed once an FEM mesh
existed. Both are fixed at every site that walked the document the same way
(#414).- A transcript replay now lists a prepared
case_dir/sif/case/deckunder
Prerequisites instead of pointing at a directory nobody was asked to create
(#437). - A native install's
config.tomlpath is no longer sourced inside a container that
lacks it, which used to fail withblockMesh: command not found
(#422). pocket/holeno longer rejectstricton the MCP surface withTypeError
(#287).
Security
- The solver images' build inputs are pinned: CalculiX over HTTPS with a SHA-256,
preCICE by commit, and the OpenFOAM apt repo key checked instead of piped to
bash. The documenteddocker runis least-privilege (--network none,
--cap-drop ALL,--read-only,no-new-privileges, non-root)
(#423).
0.5.5 — directory-policy ready
The release that answers Anthropic's Software Directory Policy point by point. A
session used to pay ~114k tokens of tool definitions before its first call; tools now
come in families an install switches on, and the Claude Desktop extension starts with
the model → drawing → analysis loop at ~31k. run_script, which runs agent-written
Python with full file access, is off in the extension unless the user turns it on.
And a reviewer guide gives three example prompts whose results are checked against
the real server on every change, including an FEM run held to beam theory.
Added
-
Tool families (toolsets). The 281 tools are grouped into 12 families —
core
(always on),drawings,fem,components,sheet_metal,assembly,intent,
manufacturing,hand_calcs,simulation,plm,rendering— and only enabled
families are registered, so a disabled family costs no context. Selected with
ANKUSDRIVE_TOOLSETS(env, ortoolsetsin config.toml). Unset keeps every
family, so existing installs are unchanged; an unknown name refuses to start
rather than silently dropping a family.setup_status,ankusdrive doctorand
solve_capabilitiesreport each disabled family with exactly how to enable it
(#377). -
ANKUSDRIVE_ALLOW_RUN_SCRIPTgates therun_scripttool, which executes
agent-written Python with full file and process access. Unset means allowed, so
pip / pipx / uvx / clone installs keep their current behaviour;falseunregisters
the tool, andsetup_status/doctorreport how to enable it. An unparseable
value refuses to start. The worker also refusesrun_scriptcalls from the MCP
tool while the switch is off; package-internal callers (feature templates) and
ankusdrive run script.pyare unaffected
(#378). -
docs/REVIEWER_GUIDE.md, for anyone evaluating the Claude Desktop extension:
install, asetup_statuscheck, three example prompts (a modeled plate's volume and
mass, a cantilever FEM checked against beam theory, a drawing exported to DXF with an
honest manufacturability gate), the default configuration, and troubleshooting. Each
prompt's tool sequence runs in the extension's default configuration as
tests/test_reviewer_scenarios.py, which asserts the numbers the guide quotes
(#368).
Changed
- The Claude Desktop extension's
run_scriptis off by default: it's an
install-dialog toggle, and the launcher treats a toggle the host did not pass as
off (#378). feature_instantiateis annotated destructive (was additive): it hides the host
body after stamping the feature, which edits an existing object
(#378).- The Claude Desktop extension now defaults to
core,drawingsandfem: 111 tools
(run_scriptis off by default), ~125k characters of tool list (~31k
tokens) instead of all 281 (~457k, ~114k tokens). Each other family is an install-dialog toggle. A tools/list budget test
holds the default under 140k characters
(#377).
0.5.4 — reviewable as a desktop extension
The release that makes AnkusDrive reviewable as a desktop extension. Every one of the
281 tools now says what it is and whether it can change your work, so clients can run
the read-only ones unasked and confirm the rest; the package ships a privacy policy
backed by an audit that found no network access in its code; and the .mcpb carries
both, which Anthropic's extension directory requires. Two capabilities arrive with it:
a Blender studio backend for photoreal renders, and a container backend for the
OpenFOAM-backed solver families.
Added
- Every MCP tool now carries a display
titleand behaviour hints (readOnlyHint,
destructiveHint,openWorldHint: false), so clients can auto-approve the 143
read-only tools and ask before the 46 that may change or remove existing state
(closing documents, overwriting files, editing objects,run_script). The
classification lives in one registry,ankusdrive/tool_annotations.py, with each
destructive mark's reason. The server refuses to import with an unclassified tool,
and a fast-lane test fails a read-only tool whose handler visibly mutates
(#368). PRIVACY.md, plus a README Privacy Policy section andprivacy_policiesin the
MCPB manifest. AnkusDrive collects nothing and its code makes no network requests;
the policy lists exactly what is stored locally and where
(#368).- A Blender (Cycles) backend for
render_photoreal: assemblies with per-part
appearance (the 14 Render card names or a neutral PBR dict), a studio scene
(cyclorama plus key/fill/rim/top lights scaled to the model),qualitydraft /
preview / final with OIDN denoising, GPUdeviceauto-selection with CPU fallback,
and a.blendalongside the PNG for refinement in Blender. Blender is discovered
like a solver (ANKUSDRIVE_BLENDER_PATH, PATH, per-OS dirs), reported by
setup_status/render_capabilitieswith an install hint, and installable with
scripts/install-renderers.sh blender/install-solvers.ps1 blender
(#357). - A container substrate for the OpenFOAM-backed families:
ANKUSDRIVE_SUBSTRATE
=native | wsl | multipass | container, with docker / podman / nerdctl via
ANKUSDRIVE_CONTAINER_ENGINE. Unset keeps each OS's existing default; an invalid
selection raises a named error rather than silently defaulting. See
docs/CONTAINER_SUBSTRATE.md(#366).
Fixed
solve_capabilities,setup_statusanddoctorreported openEMS, Bempp and KrakenOS
as absent on installs where the worker actually runs them: discovery checked the
module in its own process, not the dedicated interpreter the solve uses. One
resolver,solvers.solver_python, now probes each candidate interpreter in a child
process (find_spec only, so the GPL boundary holds) and is shared by discovery and
the worker (#353).- The release's
.mcpb.sha256nameddist/ankusdrive-<version>.mcpb, so
sha256sum -cbeside a downloaded bundle failed; it now names the bare filename
(#355).
Changed
0.5.3 — one-click install
The release that makes AnkusDrive a one-click install. Every GitHub release now
carries an .mcpb bundle for Claude Desktop, the same file the Smithery listing
distributes, and it was verified end to end in Claude Desktop — including on a machine
with no uv, where the host downloads its own. Installing that way exposed a quieter
defect: the install hints assumed a plain venv, and every managed install (the
extension, uvx from the MCP Registry, pipx, uv tool) was being told to run a pip
that could not reach it. Both land here, with a reproducible FEM mesh behind them.
Added
- An MCPB bundle,
ankusdrive-<version>.mcpb, attached to every GitHub release — the
one-click Claude Desktop install and the artifact the Smithery listing distributes.
It carries no AnkusDrive code:mcpb/pyproject.tomlpins the matching PyPI release
and the host resolves it withuv(manifest 0.4,server.type: "uv"), so the bundle
is ~34 kB and handles numpy/Pillow on every platform. One optional install field,
the FreeCAD command path. A launcher shim dropsANKUSDRIVE_*values that arrive as
unexpanded${user_config.*}text, which the MCPB reference host leaves in place for
an unset option and AnkusDrive would otherwise read as an explicit, nonexistent
FreeCAD path.publish.ymlbuilds it after the PyPI upload and creates the GitHub
release from the changelog section when it does not exist yet
(#201).
Fixed
-
Install hints now match how AnkusDrive was installed.
setup_status,doctor,
solve_capabilitiesand every*_submitdegradation used to say
pip install 'ankusdrive[X]', which under pipx,uv tool,uvx(the MCP Registry
launch) and the Claude Desktop extension installs into a different Python and
leaves the family missing with no explanation.ankusdrive/install_kind.py
detects the install (ANKUSDRIVE_INSTALL_KIND, else the interpreter path) and
rewrites pip hints:pipx runpip ankusdrive install …,uv tool install --reinstall 'ankusdrive[X]',uvx --from 'ankusdrive[X]' ankusdrive mcp, and for
the extension a plain statement that extras cannot be added, with the pipx route.
Non-pip hints and plain venvs are unchanged. The report gainsinstall: {kind, source}; the FreeCAD worker receives the host's kind, since its own interpreter is
FreeCAD's; the MCPB launcher announcesmcpb. A fast-lane test fails any hint
string that bypasses the routing
(#347). -
fem_meshandfem_cantilever_demomesh with serial Gmsh, like the Elmer and
warpage bridges already did. Gmsh's threaded 3-D Delaunay is nondeterministic, so
the same model meshed to a different tet count run to run (390–406 tets, max
displacement 0.0497–0.0512 mm on one 24-core box) and a FEM test flaked; the result
is now identical across runs, for ~3% more meshing time on a 440k-tet part
(#344).
Changed
- The FreeCAD-path config key is
freecadcmdeverywhere:smithery.yamlsaid
freecadCmdwhileconfig.tomland the bundle sayfreecadcmd
(#201).
0.5.2 — the MCP Registry listing
The release that puts AnkusDrive on the official MCP Registry. The registry proves
PyPI ownership by reading an mcp-name: token out of the README as uploaded, and
0.5.1's upload predates that token — so, as with 0.5.1's frozen project page, only a
new version can carry it. This is the first release whose tag push lists itself.
Added
- AnkusDrive is listed on the official MCP Registry
asio.github.gchen19/ankusdrive.server.jsondescribes the PyPI package
(uvx ankusdrive mcp, optionalANKUSDRIVE_FREECADCMD); the README carries the
mcp-name:ownership token the registry reads from the PyPI upload; and
publish.ymlpublishes to the registry after every PyPI release, via GitHub OIDC
with a pinned, checksum-verifiedmcp-publisher. A fast-lane contract test
fails any release PR whoseserver.jsonversion drifts from__version__
(#201).
Changed
fem_runandfem_cantilever_demodefault their workdir to
<TMPDIR>/ankusdrive_feminstead of a literal/tmppath, so the default follows
the platform's temp directory. Callers that passworkdirsee no change. The FEM
tests now remove their CalculiX scratch dirs at exit instead of stranding
multi-MB result files on the runners;ANKUSDRIVE_KEEP_SCRATCH=1keeps them for
debugging (#336).
0.5.1 — the first release after going public
The first release cut after the repository became public. Its reason for existing
is unglamorous: a PyPI project page's description is frozen at upload time, so
0.5.0's page keeps a broken wordmark and ~30 dead links to a repository that was
private when it was published. Only a new version picks up a working README.
Everything else here is hardening that accumulated behind it.
Added
ankusdrive doctorcertifies the MCP server itself — a real stdio handshake —
rather than stopping at FreeCAD resolution (#289).scripts/install-core.ps1: the whole Windows first run as one script — venv,
the pins that matter,doctor, an MCP handshake, and a registration block with
absolute paths filled in (#290).- A documented install path for Ubuntu 24.04+ and containers, where
apthas no
FreeCAD candidate and snap/flatpak both fail: the official AppImage, extracted
(#291). SECURITY.md— a private reporting route, a scope statement for a project whose
headline feature is executing Python, and what is handled upstream
(#305).- Per-platform solver install guides — macOS, Linux, and Windows — transcribed
from the reference machines and scrubbed to placeholders
(#320). CONTRIBUTING.md(the seven registration points a new tool touches, the CI
lanes, and a Releasing section), a Contributor Covenant 2.1
CODE_OF_CONDUCT.md, and this changelog
(#318).- An issue chooser whose contact link routes a suspected vulnerability to
private reporting instead of a public issue — plus bug / question /
tool-request forms and a PR template
(#322).
Changed
bounding_boxreports the analytic box as the upper bound it is, and can measure
the tight one instead of implying it already did
(#294).- Three
docs/plans whose work had shipped moved todocs/archive/; three more
that survived the sweep were rewritten, because surviving an archive pass is not
the same as having been read (#305). - Every PR-triggered CI lane runs on GitHub-hosted runners. A green Windows run
now certifies the documented install path end to end — the FreeCAD portable
archive plusscripts/install-solvers.ps1 su2 elmer, landing exactly where
solver discovery probes (#326). tests/run_all.shfalls back topython3when there is no.venv, so a
machine where one interpreter satisfies every import runs the whole suite
under it (#326).
Fixed
boolean_opnames the two degenerate cuts — no intersection, and a cut that
removes everything — instead of returning a volume that looks like a result
(#292).fillet_edgesvalidates the blend before handing back a handle, and names the
edge that broke it (#293).- The macOS heavy-solver lane reports the stale-rename failure by name, and stops
reading a stderr warning as a verdict
(#304). - The MCP test suite forwards
ANKUSDRIVE_*to the server it spawns. The stdio
client's scrubbed default environment silently dropped every override, so the
suite passed only where FreeCAD was findable by PATH or glob luck
(#326). - Two tests asserted environment variables the CI box merely happened not to
export (#319).
Security
- Every commit on every ref is scanned for credentials in CI, by a gitleaks binary
pinned to a version and verified against its published checksum rather than
trusted by tag (#300). - All 18 GitHub Action references are pinned to commit SHAs, each resolving the tag
already in use rather than silently taking a major bump
(#301). - Fork pull requests cannot reach a persistent machine, structurally. First the
self-hosted lanes learned to skip them (#302);
then every PR-triggered lane moved to hosted runners outright, so fork PRs run
the FULL suite and the exposure class is gone rather than trigger-guarded
(#326). Self-hosted machines
serve only scheduled solver regressions. - The repository is public as of 2026-09-10, with the protections that only
exist on public repos turned on the same hour: branch protection with five
required hosted checks and linear history, av*tag ruleset, secret scanning
with push protection, SHA-pinning enforcement for every action, private
vulnerability reporting, and Dependabot
(#303). - A fast-lane guard sweeps every tracked file and path for machine-identifying
content — home directories, hostnames, tailnet names, ANY contributor's, in
any encoding — without itself naming what it forbids
(#323); self-hosted job logs
mask the runner's identity before the first step prints
(#325).
0.5.0 — the rename: DriftPin becomes AnkusDrive
The project was renamed from DriftPin to AnkusDrive, and published to PyPI.
Under that headline sits the largest release so far: the simulation surface grew
past structural FEM into molding, full-wave EM, granular mechanics, exterior
acoustics and coupled FSI; a design-control layer arrived so an agent can manage
designs rather than files; Windows and Apple Silicon became first-class rather
than aspirational; and the CFD work grew a trust layer, so a number now arrives
with the evidence that it converged.
Upgrading from 0.4.x is a rename, and every surface keeps accepting the old
spelling for exactly this one release. Read
MIGRATION.md first — especially the part about DP_* document
properties, whose failure mode if the shims are ignored is silent.
Added
Simulation — new physics.
- Nonlinear structural analysis via CalculiX: plasticity, large deflection, contact
(#94). - Full-wave FDTD electromagnetics via openEMS — waveguide cutoff, dipole resonance
(#95). - Granular and powder mechanics via YADE (DEM): random close packing, Beverloo
discharge, angle of repose (#96). - Exterior acoustics via Bempp (BEM): monopole radiation, Mie scattering
(#97). - Partitioned fluid–structure interaction via preCICE, coupling OpenFOAM to
CalculiX (#98). - Injection molding end to end: analytic moldability screen, an interFoam fill
solve, the openInjMoldSim OF7 fill case, the packing/cooling stage, and warpage
as a CalculiX thermo-elastic post-step
(#109,
#112,
#114,
#115,
#133). - Optics: lens design and optimization via optiland, non-sequential STL tracing via
KrakenOS (#89). - Laminates: classical lamination theory effective properties, bimetal warp,
first-ply failure (#129).
Simulation — trust and search.
- The virtual wind tunnel: arbitrary solids in external flow, not just the library
of canonical shapes (#253). - A CFD trust layer — convergence history,
checkMesh, measured y+, Richardson
extrapolation and GCI — so a drag number arrives with its own evidence
(#255). - A verified oracle for turbulent external flow: "gated" became per (model, case
family) rather than a single blanket claim
(#266). - Performance contracts:
declare_performance/verify_performance, which then
became gates consulted by merge, substitutability and the builder brief
(#256,
#267). study_submit(DOE / parameter sweeps) andoptimize_submit(vary parameters
until the spec is met, then prove it), the latter running over a recipe on a
main-thread work queue (#258,
#259,
#273).fem_result_probe— stress and displacement at a point or a face
(#126).
Designs, not just parts — the design-control layer.
- Item model and part numbering (#150),
part recipes (#151), a
driving/driven parameter DAG (#153),
revision and lifecycle state (#154),
a Liskov substitutability gate (#155),
variant families from a design table (#156),
declared-input feature recipes (#157),
a project container with a master skeleton and reference-integrity guard
(#158), versioned interface types
with a conformance gate (#159), and
ECO records with where-used impact and baselines
(#160).
Manufacturing and release.
- Sheet metal: bends and flanges, K-factor unfold, flat pattern, layered DXF
(#243). - An honest CNC machining time, and a reason to loosen a tolerance rather than a
bare cost number (#242). - Inspection: ballooned drawings, an inspection plan, an AS9102-shaped FAI report
(#240). release_package— a one-call vendor/RFQ bundle, gated by lifecycle state, ECO
and the title block (#241).- Orderable standard parts: canonical designations and an off-the-shelf catalog
(#244). - Headless 2D drawings: multi-view PDF/SVG/DXF with dimensions, a manufacturability
and legibility gate, lane packing, a title block, an iso pictorial and an
automatic cross-section (#80,
#86,
#87).
Reference corpora.
- Mechanical properties with FreeCAD's own material cards first-class, plus
provenance and basis (#119). - ISO threads and fasteners, bearing C/C0 ratings, ISO 286 fits, stock tables
(#118). - Thermophysical fluid properties via CoolProp
(#117). - A typed units and quantity layer at the tool boundary
(#128).
Platforms.
- Windows is a first-class target: FreeCAD and
ccxdiscovery,doctor, native
solvers, a CI lane, a native bash-free SU2 runner, verified Elmer thermal
families, and the OpenFOAM-backed families routed through WSL
(#206,
#207,
#209,
#214). - Apple Silicon: a Darwin solver path and discovery glob, a per-OS substrate
launcher with Multipass discovery, the coupled FSI solve routed through the VM,
the molding and CFD families reaching the same in-VM trust, and openInjMoldSim
arm64-enabled and live-verified
(#213,
#217,
#218,
#221,
#275,
#286). - A persistent config file as a resolution layer — env →
config.toml→ auto —
because MCP hosts launch with a minimal environment and a shellexportnever
reaches them (#210). - Agent-guided setup: a
setup_statustool, adiagnose_setupprompt, an
ankusdrive://setupresource, and an interactive provisioner with
--print-mcp-config(#211,
#212).
Multi-agent design.
- A motion oracle — does the assembly actually move? (RFC §11.9,
#76) — and
geometry-realizes-declaration, which asks whether the metal backs the claim
(RFC §11.10, #78). - Agents built an oracle-certified functional gearbox, with a train-ratio gate
(#77).
Changed
- The project is named AnkusDrive. Package, console script, environment
variables, config directory, MCP tool prefix, document properties and repository
all changed, with a CI guard that keeps it renamed
(#295,
#297). - The MCP server is safe for a team of agents: the shared
Workeris serialized and
each agent gets an isolated workspace
(#184). - Solver discovery distinguishes "unwired" from "absent", so a solver you have
installed stops being reported as missing
(#181). - All text file I/O opens with an explicit UTF-8 encoding, guarded by a contract
test (#215). - Errors that told you what to do now tell you something you can actually run —
cost_estimate,slice_estimate, andpress_fit_stress, which additionally
refuses an assumed modulus rather than passing an unrun check
(#263,
#268,
#270).
Deprecated
Everything below still works in 0.5.x and is removed in 0.6.0. See
MIGRATION.md.
- The
driftpinconsole script. Installed, prints a rename notice, delegates. DRIFTPIN_*environment variables, promoted to their `AN...