Resources
Blogs

By 
Istari Digital, Inc
11 Jan 2022

Hardware V&V still runs mostly by hand, and the results scatter across notebooks and shared drives. Workflow Logs are the piece of Istari Digital that records the V&V you automate — every result pinned to the exact design version it ran against.

Software automated the grind. Hardware didn’t.

Systems and mechanical engineers lose a significant chunk of their week to repetitive, non-value-add work — manually reconciling data between vendor-locked tools, reworking designs when quarterly meetings expose cross-org dependencies, and executing basic test suites by hand. Software engineers long ago automated this kind of grunt work with CI/CD (continuous integration and delivery) — the approach of automatically compiling and testing code every time someone changes it. Hardware engineering never got the equivalent.

What Istari Digital does

Istari Digital is built to break down the barriers that cause this. It’s an open, programmable hardware product ecosystem that gives no-fail industries agentic access to their existing sources of truth in vendor-neutral, machine-readable formats. That lets teams run automated workflows across tools, collaborate securely across organizational and security boundaries, and execute V&V automatically and auditably.

What Workflow Logs are

Istari Digital provides an SDK (software development kit) for orchestrating complex workflows across your engineering tools. Istari Digital itself brokers the heavy lifting — it executes functions and jobs inside each tool and versions everything it touches. The orchestration that ties those steps together runs where it’s most flexible: in your own scripts, notebooks, and CI pipelines. Workflow Logs are the feature that closes the loop: they let you track those external workflows and tie their results to a specific configuration of your models inside Istari Digital.

Istari Digital terminology

Jobs, agents, and modules are the core of Istari Digital’s architecture. An agent is a small piece of software installed where your engineering data lives. Paired with a module — basically a translator for a specific tool like CATIA or PTC Windchill, or an internal one — the agent runs jobs against that data on command, under the permissions an admin grants and using a provisioned license if required.

Workflows chain those jobs together — and any off-platform analysis — into an end-to-end task, written in Python against the SDK by customers or Istari Digital’s forward-deployed engineers. A Workflow Log then records each run’s result against a configuration of a specific system (a set of models tracked together).

Two examples

The rest of this post walks through two examples to illustrate how you might use Workflow Logs to accelerate engineering work.

The first demonstrates automated V&V on a single part. A design engineer runs a battery of software-defined checks against an L-bracket; when one fails, they revise the design and re-run the checks to confirm the fix. Each result is logged against the exact version of the model using Workflow Logs — an audit trail that builds itself.

The second orchestrates a full design-and-test sweep — CATIA to gmsh to Nastran — to find the wing length for a UAV that maximizes range without breaking. Istari Digital runs and versions every job; a Python script drives the sweep and computes each design’s flight range. Every result is logged, so revisiting the study never means hunting for which CAD version produced which stress number.

Example 1: automated V&V on a design change

This example is fully documented in Istari Digital’s public cookbook — a collection of runnable sample notebooks (“recipes”) for the SDK. Here we walk through it briefly; open the notebook to run it yourself as a learning exercise.

Steps 1–2 lay the groundwork in Istari Digital: connect the SDK, then create a fresh System with the bracket’s STEP file tracked. (You could also create the System by hand in the web app.)

scenario_a.ipynb · §1–2 connect + create the System

# connect the SDK - two clients share one Configuration

client = Client(config) # models, systems, jobs

v3 = V3Client(config) # workflow outputs + log entries


# seed the initial R3 bracket, then create a System that tracks its STEP file

bracket_step.write_bracket(src, fillet_radius_mm=3.0, wall_thickness_mm=3.0)

model = client.add_model(path=src, display_name="bracket.step", description="Bracket - initial R3 design")

system = client.create_system(NewSystem(name="Workflow Log Walkthrough"))

config_obj = client.create_configuration(system_id=system.id,

new_system_configuration=NewSystemConfiguration(name="baseline",

tracked_files=[NewTrackedFile(specifier_type=TrackedFileSpecifierType.LATEST, file_id=model.file.id)]))

Steps 3–4 run the external workflow: a software-defined battery of checks against the STEP file. It catches that the stress at one of the fillet radii exceeds the allowable limit.

scenario_a.ipynb · §3–4 run the checks

# pull the tracked file back out of Istari, then run the checks locally

source_bytes = client.get_file(file_id=FILE_ID).revisions[-1].read_bytes()


results = run_battery(source_bytes, work / "artifacts") # ten software-defined checks

overall = "SUCCESS" if all(r.passed for r in results) else "FAILED" # -> FAILED: stress at the R3 fillet junit = write_junit(results, work / "artifacts" / "results.xml", src.name)

Steps 5–6 are where Workflow Logs come in. The result is recorded in Istari Digital, pinned to the most recent configuration of the System — the one holding that exact version of the STEP file.

scenario_a.ipynb · §5–6 log the result

# upload each output, then create ONE entry pinned to the active configuration

upload_paths = [junit] + [r.artifact_path for r in results]

output_ids = []

for p in upload_paths:

wo = v3.create_workflow_output(system_id=SYSTEM_ID, path=p)

output_ids.append(wo.id)


entry = v3.create_workflow_log_entry(

system_id=SYSTEM_ID,

workflow_log_entry_create_dto=WorkflowLogEntryCreateDto(

title="Verification battery - iter-1 (initial design)",

status=overall, # SUCCESS | FAILED

configuration_id=CONFIG_ID, # pin to this version

workflow_output_ids=output_ids,

),

)

The run lands on the record as a FAILED entry — and its commit link ties it to the exact design version it was logged against.
Follow that link and you’re in the System’s commit history — and on the left, the exact version of the STEP file this run was logged against.

Steps 7–9. The engineer now has the feedback they need. They enlarge the fillet to R5, re-run the same pipeline — this time it passes — publish a second entry, and attach the verified report back onto the model so the evidence rides with the CAD.

scenario_a.ipynb · §7–9 revise, re-run, log SUCCESS

# enlarge the fillet to R5 and commit a new revision of the tracked model

bracket_step.write_bracket(src, fillet_radius_mm=5.0, wall_thickness_mm=3.0)

client.update_model(model_id=MODEL_ID, path=src, version_name="v2-R5-fillet")

istari_helpers.commit_changes(client, SYSTEM_ID, CONFIG_ID)


# re-run the SAME battery against the new revision -> it passes -> log a SUCCESS entry

results = run_battery(client.get_file(file_id=FILE_ID).revisions[-1].read_bytes(), work / "artifacts2")

# ... then the same two calls as before: create_workflow_output + create_workflow_log_entry(status="SUCCESS")

The fix lands as a second entry — SUCCESS on iter-2 (R5), linked to its own commit of the System’s files, now holding the new version of the STEP file.

This is a simplified version of a real engineering workflow, but it demonstrates what Workflow Logs unlock.

Today, running CI/CD-style checks on hardware is painful — you find a machine to run the FEA, get access provisioned, wrangle export formats — and even then the result vanishes into whatever notebook you ran it in. With Istari Digital, your engineers run those checks every day, and every verdict lands on the record, pinned to the exact version it tested.

Run it yourself - scenario_a, the design-loop recipe

Example 2: a wing sweep across three tools

Where Example 1 used a quick calculation to stand in for the stress check, this example orchestrates a workflow across the design tools engineers actually use: it drives geometry in 3DEXPERIENCE CATIA, meshes in gmsh (an open-source mesher), and solves FEA in MSC Nastran. It also shows how Workflow Logs make the resulting digital thread more robust.

The design challenge is to find the viable range of wing lengths for a UAV. A longer wing gives more lift and more range — but it’s also a longer cantilever, so the stress at the root climbs. Too short and it can’t reach the mission range; too long and the wing can’t take the maneuver load. The answer is the window in between.

The UAV whose wing we’re sizing. WING_LENGTH is the one parameter under study — the geometry, mesh, and stress all re-derive from it.

The manual loop

The toolchain spans three programs — CATIA, gmsh, and Nastran. By hand, checking a single wing length means being the interface between all of them:

Nine manual steps. An engineer can do this once — but sizing a wing means doing it many times over.

The options today

Without Istari Digital, there are two ways to run that loop across many designs — and neither is good

Do it by hand and you’re personally clicking through all nine steps for every single design — it’s so tedious that a handful is all anyone ever actually does. Write a custom script and you have to work out how to talk to each tool — and often the specific machine on your network that runs it. Either way, you leave behind no real audit trail, or one buried in a notebook only you can read.

How Istari Digital solves it

Istari Digital orchestrates the loop for you and uses Workflow Logs to build an automatic audit trail as it runs:

The core of the workflow is one function, evaluate. Its only input is L, the wing length under test, and it runs the five steps of the loop:

  • Drive the CAD. The CATIA agent sets WING_LENGTH on the live UAV model at its source (@istari:update_parameters).
  • Extract the geometry. The same agent runs two extracts — @istari:extract_geometry writes a STEP file (the neutral CAD snapshot that captures the model at this wing length, and the version Istari Digital tracks), and @istari:extract writes an .obj, CATIA’s basic surface mesh of the model (along with other vendor-neutral artifacts the pipeline doesn’t use). The wing here is a single solid — no internal ribs or spars — so the .obj is just its outer surfaces.
  • Mesh it. The Python script picks the wing out of the .obj — dropping the fuselage and the rest of the aircraft — then uses gmsh to refine that coarse mesh into a finer, cleaner analysis mesh, fine enough to compute stress on. (This runs locally in the Python script, between the SDK-driven CATIA and Nastran agent jobs.)
  • Solve it. Nastran solves the shell model on an Istari Digital agent (@istari:run). Because the mesh is a surface, not a solid, the FEA is given a representative skin thickness (6 mm, the design’s wing-skin value); the wing is clamped at the fuselage carry-through and loaded with the lift from its worst-case maneuver, and the peak von Mises stress comes back — one number to check against the limit.
  • Score and check. The mission range is estimated from the wing’s aerodynamics, and both requirements are tested: far enough, and not over-stressed.

wing_pipeline · one design: CATIA → gmsh → Nastran

def evaluate(L): # L = WING_LENGTH (mm)

drive_wing(client, catia, L) # CATIA · @istari:update_parameters

step, obj = extract_wing(client, catia, L) # CATIA · @istari:extract (OBJ) + @istari:extract_geometry (STEP)

info = isolate_wing(obj) # isolate the wing from the .obj (drop the fuselage)

XYZ, tris = refine_wing(info["stl"], size=25.0) # gmsh · refine into an analysis mesh

bdf = build_shell_bdf(XYZ, tris, L, info["chord"]) # thin-shell deck: clamp + maneuver lift

f06 = solve_shell(client, bdf) # Nastran · @istari:run (on an Istari agent)

stress = stress_metrics(vm_by_element(f06))["peak"]

return dict(L=L, range_km=range_km(L, info["chord"]), stress=stress)

The sweep then calls evaluate across five wing lengths and logs each design against the two requirements. log_design wraps the same

create_workflow_output and create_workflow_log_entry calls from Example 1:

the sweep · one Workflow Log entry per design

for L in [1900, 2150, 2400, 2650, 2900]: # WING_LENGTH sweep (mm)

row = evaluate(L)

passed = row["range_km"] >= 235 and row["stress"] <= 45 # RNG-001, STR-001

# freeze this design as a configuration, then log the verdict - the mesh, the

# von-Mises render, the Nastran .f06, and a JUnit report ride along as evidence

log_design(client, v3, system_id, row, tracked_files, reqs) # -> Workflow Log entry (SUCCESS | FAILED)

Each Workflow Log entry captures two things:

  • The configuration it ran against — the CATIA model at its source, the STEP geometry extracted at that wing length, and the version of the requirements it was checked against. That is a governed commit — the same idea version control uses for code: one System tracking all three together.
  • The evidence the run produced — the gmsh mesh, the von Mises render, Nastran’s raw .f06 results file, and a per-requirement pass/fail report in JUnit format (the test-report format software CI already uses).
Every design lands as its own entry — three FAILED, two SUCCESS — each pinned to its version, with the mesh, stress render, Nastran .f06, and requirement report attached.

One System tracks the CATIA model, the per-design STEP revision, and the requirements together — every run a versioned commit in the history.

The result

With the sweep complete, every design comes together in one view — meshed, solved, and checked.

Only 2400 mm and 2650 mm clear both requirements — the design window. Shorter wings can’t reach the range target; the longest exceeds the stress limit.

The payoff

  • Time. Nobody spends the day clicking through CATIA or babysitting a one-off script. The SDK is the loop — point it at a range of wing lengths and it runs them.
  • Auditability. Every design is a governed commit with a PASS/FAIL Workflow Log entry. Six months from now, anyone can open the sweep and see which wing length was checked against which requirement, and how it came out.

Workflow Logs make V&V part of how you design

Without Istari Digital, V&V is burdensome and slow — so it waits for milestones and gets done all at once, late. With Istari Digital Workflow Logs,

your checks run automatically and audit themselves, so V&V stops being a phase at the end and becomes part of how you design — on every change you make, and across every candidate you explore.

And a single engineer’s loop is only the start. Picture the same discipline across a whole program — subsystem integrations checked against each supplier’s latest revision, or an airworthiness case run a hundred times in simulation before the first physical test, every result on the record. That is what unlocks the next level of speed and quality across your org.

Start here image links:

- Workflow Log SDK guide: https://docs.istaridigital.com/developers/SDK/v3/workflow-logs

- Workflow Logs in the platform: https://docs.istaridigital.com/users/user-guide/systems#workflow-log

- Runnable recipes on Github: https://github.com/Istari-digital/istari-digital-cookbook/tree/main/samples/workflow-logs

- SDK walkthrough: https://docs.istaridigital.com/developers/SDK