Skip to content

Releases: gchen19/AnkusDrive

0.5.6 — an auditable result, and a Mac as a real solver host

Choose a tag to compare

@github-actions github-actions released this 23 Sep 09:41
2e0450b

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_transcript returns 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
    become s.wait(job), and absolute paths become WORKDIR-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 becomes s.check, and its verdict fields (fidelity, correlation, solver,
    gate pass) become s.expect. A replay that reaches a different solver therefore
    stops at that step rather than returning a plausible figure. The script opens
    with a PROVENANCE record (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_script code is carried verbatim with its SHA-256
    (#407,
    #408,
    #409,
    #410,
    #433).
  • Durable journal and journal_export, opt-in. ANKUSDRIVE_JOURNAL_DIR (or
    journal_dir in 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=1 hashes paths and names, but never run_script code; a
    redacted journal can be checked but not replayed. journal_export and
    ankusdrive journal list|export turn a past session's file into the same record
    session_transcript gives. 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 as deck next to case_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 *DYNAMIC penalty-contact
    solve) and bar_impact (the closed form). They are gated against St-Venant's exact
    elastic bar striking a rigid wall (face stress ρ·c₀·v₀, contact time 2L/c₀,
    rebound at the strike speed) and against the plastic-wave cap past yield. This was
    the last unbuilt row of docs/SIMULATION_NEXT.md
    (#311).
  • fem_run_submit runs a CalculiX solve as a background job, so a long FEM run no
    longer blocks the MCP channel. fem_run stays 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 one docker 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/:full for 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.sh and ankusdrive doctor --verify-image check an
    image against this repository's workflow. doctor also reports a container that
    runs with more privilege than the documented docker run grants
    (#423).
  • scripts/install-solvers.sh elmer source-builds a pinned Elmer on Linux (including
    arm64, which has no package) and on macOS
    (#384).
  • pocket and hole accept strict=True, which escalates their "removed everything"
    and "removed nothing" warnings to errors, as boolean_op already did
    (#287).
  • solve_capabilities reports 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_ROOT moves 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=1 keeps 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 stale ANKUSDRIVE_ELMER_PATH, ANKUSDRIVE_YADE,
    ANKUSDRIVE_OPENEMS_PYTHON or ANKUSDRIVE_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. Check ankusdrive doctor after
    upgrading
    if you moved a Mac from a native or Multipass setup
    (#443,
    #422).
  • em_fullwave is gated on the solved field. The documented fc_ratio gate never
    read the FDTD field: openEMS computes the port's beta analytically, so even a
    truncated run passed. A new alpha_ratio gate 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.md and docs/MACOS.md no 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, and doctor diagnoses a blocked boot
    (#310,
    #432).

Fixed

  • STEP/IGES export of an assembly wrote an empty file and reported success.
    Exporting an App::Part (links or plain features) produced 1,640 bytes with no
    faces, and release_package shipped that to vendors. The resolved shape is now
    exported, and an export with no geometry is an error
    (#434).
  • export_shape with no object exported 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 / deck under
    Prerequisites instead of pointing at a directory nobody was asked to create
    (#437).
  • A native install's config.toml path is no longer sourced inside a container that
    lacks it, which used to fail with blockMesh: command not found
    (#422).
  • pocket/hole no longer reject strict on the MCP surface with TypeError
    (#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 documented docker run is least-privilege (--network none,
    --cap-drop ALL, --read-only, no-new-privileges, non-root)
    (#423).

0.5.5 — directory-policy ready

Choose a tag to compare

@github-actions github-actions released this 14 Sep 05:25
c9ea773

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, or toolsets in 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 doctor and
    solve_capabilities report each disabled family with exactly how to enable it
    (#377).

  • ANKUSDRIVE_ALLOW_RUN_SCRIPT gates the run_script tool, which executes
    agent-written Python with full file and process access. Unset means allowed, so
    pip / pipx / uvx / clone installs keep their current behaviour; false unregisters
    the tool, and setup_status / doctor report how to enable it. An unparseable
    value refuses to start. The worker also refuses run_script calls from the MCP
    tool while the switch is off; package-internal callers (feature templates) and
    ankusdrive run script.py are unaffected
    (#378).

  • docs/REVIEWER_GUIDE.md, for anyone evaluating the Claude Desktop extension:
    install, a setup_status check, 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_script is off by default: it's an
    install-dialog toggle, and the launcher treats a toggle the host did not pass as
    off (#378).
  • feature_instantiate is 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, drawings and fem: 111 tools
    (run_script is 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

Choose a tag to compare

@github-actions github-actions released this 14 Sep 01:58
5dba868

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 title and 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 and privacy_policies in 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), quality draft /
    preview / final with OIDN denoising, GPU device auto-selection with CPU fallback,
    and a .blend alongside the PNG for refinement in Blender. Blender is discovered
    like a solver (ANKUSDRIVE_BLENDER_PATH, PATH, per-OS dirs), reported by
    setup_status / render_capabilities with 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_status and doctor reported 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.sha256 named dist/ankusdrive-<version>.mcpb, so
    sha256sum -c beside a downloaded bundle failed; it now names the bare filename
    (#355).

Changed

  • render_photoreal's default renderer is now "auto" (was "Povray"): Blender,
    else POV-Ray, else any add-on renderer, reported as auto_selected
    (#357).
  • The mcp floor rises from 1.2 to 1.10, the first release whose FastMCP tools
    carry a title. Below it the annotations would be silently dropped
    (#368).

0.5.3 — one-click install

Choose a tag to compare

@github-actions github-actions released this 13 Sep 00:50
e9b8e1d

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.toml pins the matching PyPI release
    and the host resolves it with uv (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 drops ANKUSDRIVE_* 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.yml builds 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_capabilities and every *_submit degradation 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 gains install: {kind, source}; the FreeCAD worker receives the host's kind, since its own interpreter is
    FreeCAD's; the MCPB launcher announces mcpb. A fast-lane test fails any hint
    string that bypasses the routing
    (#347).

  • fem_mesh and fem_cantilever_demo mesh 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 freecadcmd everywhere: smithery.yaml said
    freecadCmd while config.toml and the bundle say freecadcmd
    (#201).

0.5.2 — the MCP Registry listing

Choose a tag to compare

@gchen19 gchen19 released this 12 Sep 20:22
bab73f7

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
    as io.github.gchen19/ankusdrive. server.json describes the PyPI package
    (uvx ankusdrive mcp, optional ANKUSDRIVE_FREECADCMD); the README carries the
    mcp-name: ownership token the registry reads from the PyPI upload; and
    publish.yml publishes to the registry after every PyPI release, via GitHub OIDC
    with a pinned, checksum-verified mcp-publisher. A fast-lane contract test
    fails any release PR whose server.json version drifts from __version__
    (#201).

Changed

  • fem_run and fem_cantilever_demo default their workdir to
    <TMPDIR>/ankusdrive_fem instead of a literal /tmp path, so the default follows
    the platform's temp directory. Callers that pass workdir see 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=1 keeps them for
    debugging (#336).

0.5.1 — the first release after going public

Choose a tag to compare

@gchen19 gchen19 released this 10 Sep 17:45
9f6edaf

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 doctor certifies 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 apt has 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_box reports 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 to docs/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 plus scripts/install-solvers.ps1 su2 elmer, landing exactly where
    solver discovery probes (#326).
  • tests/run_all.sh falls back to python3 when there is no .venv, so a
    machine where one interpreter satisfies every import runs the whole suite
    under it (#326).

Fixed

  • boolean_op names the two degenerate cuts — no intersection, and a cut that
    removes everything — instead of returning a volume that looks like a result
    (#292).
  • fillet_edges validates 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, a v* 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

Choose a tag to compare

@gchen19 gchen19 released this 10 Sep 17:45
115f144

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) and optimize_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 ccx discovery, 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 shell export never
    reaches them (#210).
  • Agent-guided setup: a setup_status tool, a diagnose_setup prompt, an
    ankusdrive://setup resource, 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 Worker is 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, and press_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 driftpin console script. Installed, prints a rename notice, delegates.
  • DRIFTPIN_* environment variables, promoted to their `AN...
Read more