staad-properties — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited staad-properties (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.
prop = staad.Propertyprop_id = prop.CreateBeamPropertyFromTable(countryCode, sectionName, typeSpec, v1, v2)
prop.AssignBeamProperty(beam_ids, prop_id) # returns True on success, raises on failureCountry codes (full table in the Reference section — PROPERTY_CODES.md):
| Code | Country | Code | Country |
|---|---|---|---|
| 1 | American | 9 | German |
| 2 | Australian | 10 | Indian |
| 3 | British | 11 | Japanese |
| 4 | Canadian | 12 | Russian |
| 5 | Chinese | 13 | South African |
| 7 | European | 16 | Korean |
Type spec:
| Code | Spec | Description |
|---|---|---|
| 0 | ST | Standard single section |
| 2 | D | Double |
| 5 | T | Tee |
| 6 | CM | Composite |
| 7 | TC | Top cover plate |
| 8 | BC | Bottom cover plate |
| 9 | TB | Top+bottom cover plates |
Specialized shape creation:
| Function | Shape |
|---|---|
CreateAnglePropertyFromTable(country, name, spec, addSpec) | Angle (L) |
CreateChannelPropertyFromTable(country, name, spec, addSpec) | Channel (C) |
CreateTubePropertyFromTable(country, name, spec, v1, v2, v3) | Hollow rectangular |
CreatePipePropertyFromTable(country, name, spec, v1, v2) | Hollow circular |
CreateTeePropertyFromTable(country, name, spec) | Tee (WT) |
CreateWideFlangePropertyFromTable(country, name, spec, specsList) | Wide flange extended |
Name helpers — CRITICAL validation workflow: Before calling CreateBeamPropertyFromTable, validate the section name exists in the database:
code = prop.GetShapeCode(countryCode, sectionName)
if code < 0:
print(f"Section '{sectionName}' not found in country {countryCode}")
else:
staad_name = prop.GetSTAADProfileName(sectionName, countryCode)
print(f"Valid section: {staad_name} (shape code {code})")GetShapeCode(country, name) → shape code integer (negative = not found)GetPublishedProfileName(name, country) → catalog nameGetSTAADProfileName(name, country) → STAAD internal nameprop_id = prop.CreatePrismaticRectangleProperty(depthY, depthZ)
prop_id = prop.CreatePrismaticCircleProperty(diameter)
prop_id = prop.CreatePrismaticTeeProperty(depth, flangeW, stemD, stemW)
prop_id = prop.CreatePrismaticTrapezoidalProperty(depth, topW, bottomW)
prop_id = prop.CreatePrismaticGeneralProperty([AX,AY,AZ,IX,IY,IZ,YD,ZD,YB,ZB])prop_id = prop.CreateTaperedIProperty([depth_start, web_t, depth_end, top_w, top_t, btm_w, btm_t])
prop_id = prop.CreateTaperedTubeProperty(type, start_d, end_d, thickness)
# type: 0=Round, 1=Hex16, 2=Dodecag, 3=Oct, 4=Hex, 5=Squarethick_id = prop.CreatePlateThicknessProperty([t, t, t, t]) # list of 4 floats, one per node
prop.AssignPlateThickness(plate_ids, thick_id)# Create
prop.CreateIsotropicMaterialProperties(name, E, poisson, G, density, alpha, damping)
prop.CreateIsotropicMaterialPropertiesEx(name, E, poisson, G, density, alpha, damping, fy, fu, ry, rt, fcu)
# Convenience
prop.CreateIsotropicMaterialSteel(name, E, poisson, G, density, alpha, damping, fu, fy, rt, ry, is_physical)
prop.CreateIsotropicMaterialConcrete(name, E, poisson, G, density, alpha, damping, fc, physical)
# Assign
prop.AssignMaterialToMember("STEEL", member_ids)
prop.AssignMaterialToPlate("CONCRETE", plate_ids)
prop.AssignMaterialToSolid("CONCRETE", solid_ids)
# Query
E, nu, density, alpha, damp = prop.GetMaterialProperty("STEEL")
name = prop.GetBeamMaterialName(beam_id)prop.AssignBetaAngle(beam_ids, angle_degrees)
angle = prop.GetBetaAngle(beam_id)# Releases
rel_id = prop.CreateMemberReleaseSpec(end, dofValues, springConstants)
# end: 0=start, 1=end; dofValues: [FX,FY,FZ,MX,MY,MZ] → 0=fixed, 1=released
prop.AssignMemberSpecToBeam(beam_ids, rel_id)
# Special member types
truss_id = prop.CreateMemberTrussSpec()
tens_id = prop.CreateMemberTensionSpec()
comp_id = prop.CreateMemberCompressionSpec()
cable_id = prop.CreateMemberCableSpec(tension_or_length, value)
inact_id = prop.CreateMemberInactiveSpec()| Function | Returns |
|---|---|
GetSectionPropertyCount() | total section properties |
GetSectionPropertyList() | list of property IDs |
GetSectionPropertyName(sid) | section name string |
GetSectionPropertyAssignedBeamList(sid) | beams using that section |
GetBeamSectionName(bid) | section name for beam |
GetBeamProperty(bid) | (w, d, AX, AY, AZ, IZ, IY, IX) |
GetBeamPropertyAll(bid) | adds tf, tw to above |
GetPlateThickness(pid) | list of 4 floats |
GetThicknessPropertyCount() | total thickness properties |
CreatePlateThicknessProperty takes a list of 4 floats, one value per corner — not a single scalarAssignBeamProperty returns True on success and raises on failure — call it directly; do NOT check if result < 0 (execute_code reports any uncaught error)GetBeamList() / GetPlateList() before assigning — never assume IDs start at 1GetMemberDesignSectionName(bid) raises an error when results are unavailable — use GetSectionPropertyName for pre-analysis lookup"STEEL", "CONCRETE", "ALUMINUM" — case-sensitive~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.