Skip to content

0.5.0 — the rename: DriftPin becomes AnkusDrive

Choose a tag to compare

@gchen19 gchen19 released this 10 Sep 17:45
· 146 commits to main since this release
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 ANKUSDRIVE_* names at
    startup unless the new name is already set.
  • ~/.config/driftpin/config.toml and %APPDATA%\driftpin\config.toml, still read
    when no ankusdrive config exists. Writes always go to the new path.
  • Solvers provisioned under a DriftPin/solvers directory, still discovered on
    Windows and macOS.
  • DP_* document properties. Reads accept either spelling and a write updates the
    old property in place. This is the shim worth understanding: had the old names
    simply been dropped, an annotated part would open fine and read back as though it
    had never been annotated — no interfaces, no intent, no verdict, and no error.
    Removing the fallback in 0.6 will come with an explicit document migration.

Fixed

  • mcp is pinned below 2.0, which installs cleanly and then breaks ankusdrive mcp
    by dropping mcp.server.fastmcp
    (#285).
  • add_primitive honours name= by setting the object's Label
    (#250).
  • A modal solve that never finished is reported as its own outcome rather than as a
    floppy part (#252).
  • The built wheel and sdist are tested for the runtime corpora they must carry, so a
    package-data omission fails in CI instead of at a pip-installed user's first
    thread() (#251).