staad-errors — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited staad-errors (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
execute_code wraps your whole script in a top-level handler: any uncaught exception is captured and returned as success: false with the (sanitized) error message plus whatever you printed before it. You do NOT need `try/except` just to report a failure — let it propagate and read the error from the tool result.
Use try/except inside a script only when it changes control flow, e.g.:
In the MCP sandbox, import is blocked. You cannot import typed exception classes from openstaadpy.os_analytical.oserrors. Instead, catch generic Exception and inspect the message or code.
The openstaadpy wrapper wraps COM objects in a proxy layer that turns cryptic COM failures into actionable messages. If a COM method is missing or fails, the error typically tells you to update STAAD.Pro to the latest version — this usually means the connected STAAD instance is older than the function requires (see staad-core → Version Compatibility), not a coding mistake.
Many methods raise on failure — call them directly and let execute_code surface any error. This applies to the Assign* methods and the support create/assign/query/delete methods, which return True on success and raise on failure:
prop.AssignBeamProperty(beam_ids, prop_id) # True on success; raises on failureSome query/getter methods still return negative integers on error instead of raising — for those, check the sign:
shape = prop.GetShapeCode(country, name)
if isinstance(shape, int) and shape < 0:
print(f"Section not found (code {shape})")Catch per-item inside a loop so one bad entity doesn't abort the whole batch:
geo = staad.Geometry
def safe_add_beam(start, end):
try:
return geo.AddBeam(start, end)
except Exception as e:
print(f" Beam ({start}->{end}) skipped: {e}")
return None
for s, e in [(1, 2), (2, 3), (3, 99)]:
bno = safe_add_beam(s, e)
if bno:
print(f"Added beam {bno}")| Range | Category | Examples |
|---|---|---|
-1 | General error | Generic failure |
-2 | Invalid model path | OsInvalidModelPath |
-100 to -125 | Argument errors | Invalid argument, out of range |
-101 | Model not opened | OsModelNotOpened |
-114 | OLE exception | OsOleException |
-115 | License not supported | OpenSTAAD Professional functions unavailable |
-1003 | File error | File not found / access denied |
-2001 to -2006 | Node errors | Node not found, duplicate node |
-3001 to -3005 | Beam errors | Beam not found, invalid incidence |
-3006 | Invalid member number | OsInvalidMemberNo |
-4001 to -4009 | Plate errors | Plate not found, invalid node count |
-5001 to -5005 | Solid errors | Solid not found |
-6001 to -6045 | Property errors | Profile not found, invalid property |
-7001 | Group error | Group not found |
-8001 to -8041 | Load errors | Load case not found, create failed |
-9004, -9911 | Results errors | Results not available |
These surface as raised exceptions (the message names the condition). In the sandbox, catch generic Exception and read the message:
| Code | Class | Meaning |
|---|---|---|
-2 | OsInvalidModelPath | Invalid model path |
-101 | OsModelNotOpened | STAAD model is not opened |
-114 | OsOleException | OLE exception occurred |
-115 | OsLicenseNotSupported | License lacks OpenSTAAD Professional functions |
-3006 | OsInvalidMemberNo | Invalid member number ID(s) |
out.AreResultsAvailable() before querying resultsexecute_code returns the error; only add try/except for loop-skip or fallback control flowfrom openstaadpy.os_analytical.oserrors import OsBeamNotFound — but NOT in the MCP sandboxexecute_code already catches uncaught exceptions — do NOT wrap a single call in try/except just to print the errorUpdateStructure on read-only paths)Assign* methods (AssignBeamProperty, AssignDesignCommand, AssignDesignParameter, AssignDesignGroup) and support create/assign/query/delete methods raise on failure and return True on success — do NOT check if result < 0 for theseif result < 0 for those~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.