agentleFS
skycivskyciv/skyciv-ai-skills/baseplate/SKILL.md

baseplate

Skill11 starsChanged 32 days agoMITView on GitHub

Use when designing or checking a steel column base plate connection through the SkyCiv API — base plate thickness and bearing, anchor bolts / anchor rods / holding-down bolts (tension, shear, pullout, concrete breakout, pryout, side-face blowout), column-to-plate welds, and the supporting concrete footing or pedestal. Covers the standalone.baseplate.start and standalone.baseplate.check calls, the full design_obj input (units_data, steel_parts, anchors, welds, loads, factors, detailing, design_settings) and how to read the per-check demand/capacity/ratio response, for AISC 360 / ACI 318 (American), AS 4100 / AS 3600 / AS 5216 (Australian), CSA S16 / A23.3 (Canadian) and EN 1993-1-8 / EN 1992-4 (Europe). Trigger even without the word SkyCiv, e.g. 'size a base plate for this column', 'check my anchor bolts', 'column footing connection', 'feed these support reactions into a base plate check'. Not for general member design (use run-quick-design) or for solving the frame itself (use s3d-api).

The file

We split this skill into the rules it gives an agent

5 rules. About 0 are common, 1 is distinctive, and 4 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈1

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Only concentric column / plate / foundation layouts with symmetric anchors are supported.

    line 16
  2. Very specific:

    Start from that code's sample-api/<country>/input.js (see Worked examples) and change only what you need.

    line 24
  3. Very specific:

    Check response.status. On 1, read errors / warnings / conflicts (below) and fix the input.

    line 28
  4. Very specific:

    All request values and all response demand/capacity values use these units.

    line 109
  5. Very specific:

    Use section-selector to get the column's database/profile names, and hand the finished results to qa-engineer for review.

    line 314

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Base Plate Design

Design and check a steel column base plate connection — base plate, anchor bolts, welds and the concrete below — with the SkyCiv standalone.baseplate API.

Prerequisite: open the session with standalone.baseplate.start, not S3D.session.start (verified: a check after S3D.session.start returns "Session has not been started. Please call standalone.baseplate.start first."). Auth, options and the { auth, options, functions } envelope are in skyciv-api-v3.

Only concentric column / plate / foundation layouts with symmetric anchors are supported.

Workflow

  1. Choose design_code and load its reference file — it holds every accepted material, grade, diameter, electrode and the factors block for that code: American · Australian · Canadian · Europe.
  2. Start from that code's sample-api/<country>/input.js (see Worked examples) and change only what you need. Every key must be present, even unused ones.
  3. Send standalone.baseplate.start then standalone.baseplate.check in one request. design_obj is the arguments object — not nested under another key.
  4. Check response.status. On 1, read errors / warnings / conflicts (below) and fix the input.
  5. Scan every check for its ratio (see Reading the response).
"functions": [
  { "function": "standalone.baseplate.start", "arguments": { "keep_open": true } },
  { "function": "standalone.baseplate.check", "arguments": { "design_code": "American", "...": "..." } }
]

Several checks can follow one start in a request (verified; top-level response is the last). Each check takes about 11–20 s and uses one API credit.

Gotchas

  • Invalid strings are silently replaced, not rejected. An unknown material, concrete grade or anchor diameter returns status: 0 with results computed on a default value (verified for column, base plate, anchor and concrete grades, and Canadian diameters). Copy values exactly from the reference file, and confirm the relevant capacity moved when you change one.
  • Canadian anchor diameters are imperial sizes in mm (12.7, 15.9, 19.1, 22.2 …). The 12, 16, 20… list in the live docs is silently ignored — see canadian.md.
  • A failing detailing check hangs the call instead of erroring. Verified with embed_plate (embedded plate side < 4 × anchor diameter): no conflicts are returned — the call runs until the server timeout (~45 s) and returns "standalone.baseplate.check timed out". options.timeout does not extend it. Treat any timeout as an input problem: check the detailing rules below against your geometry before retrying.
  • My must be "0". It is reserved for future weak-axis support; any non-zero value ("1", "10") hangs the call until timeout.
  • A fixed base needs a non-zero Mz in every load case. Otherwise status: 1 with the conflict "configured as a fixed support, but the load combination does not include a moment". Axial-only or axial + shear cases go on a pinned base.
  • A wrong section name fails fast with an unhelpful message — "could not be completed for an unknown reason" in ~5 s. steel-column-database is the third level of the section library path and steel-column-profile the fourth (e.g. American › AISC › Pipes › Pipe6STD → "Pipes", "Pipe6STD"). Resolve both with section-selector.
  • status: 0 does not mean the design passes — a run returned a breakout ratio: 1.248 with status: 0. Derive pass/fail from the ratios.
  • capacity: 0 with ratio: 0 means "not evaluated", not a pass with infinite margin — e.g. Weld Capacity on an axial-only pinned base, Side-Face Blowout (Y-Direction) when no anchor is near that edge. Report these as N/A.
  • Concrete Bearing Capacity sits at ratio: 1 for American/Canadian fixed bases under large moment. Ratio 1 = demand equals capacity (limit reached). This method takes bearing stress at its limit and solves for the bearing length, so the ratio stayed 1.000 when the plate grew 400 → 500 mm and the footing 450 → 900 mm. Report it as at-limit, but size the connection on the other checks — enlarging the plate won't move it. Small eccentricity (Nx = 200, Mz = 2) gave 0.102.
  • Load values are strings ("Mz": "10") in every sample; keep them strings.
  • Report URLs are temporary (solver.skyciv.com/temp/...).
  • Strip screenshot before logging a failure — status: 1 responses carry a 60–200 KB base64 PNG of the calculator UI. Decode it only when diagnosing.

design_obj — top level

KeyTypeDescription
design_codestringAmerican, Australian, Canadian or Europe (not European).
support_typestringfixed (needs Mz ≠ 0 in every case) or pinned.
units_dataobjectUnit system — see below.
project_detailsobjectproject_units (metric/imperial) plus optional strings company, designer, project_name, project_id, project_notes, client ("" if unused).
steel_partsobject{ data: {...} } — column, base plate, foundation.
anchorsobject{ data: {...} } — anchor layout, size, material, end type.
weldsobject{ data: {...} } — column-to-plate welds.
loadsarrayLoad cases — see below.
factorsobjectResistance / partial factors. Keys differ per code — copy the block from the code's reference file.
detailingobjectDetailing check flags — see below.
design_settingsobjectMethod options — see below.
versioninteger2.

Units

units_data.units (metric / imperial) and project_details.project_units control the unit system. Imperial is American-only; the other three codes are metric.

KeyMetricImperial
unitsmetricimperial
units_lengthmmin
axial_f_units (axial and shear)kNkips
bending_f_unitskN-mkip-ft
units_strength (concrete)MPapsi
units_strength_steelMPaksi

All request values and all response demand/capacity values use these units. Copy the remaining units_data keys (first_init, length_factor, strength_factor, strength_factor_steel, to_mm, to_in, kNm_Kipft, kN_Kip) from the sample unchanged — verified to have no effect on results in either unit system (the American sample's length_factor: 25.4 is harmless).

steel_parts.data

KeyTypeDescription
steel-column-shapestringi-shape, rectangular or pipe. Sets the allowed anchor-patterns.
steel-column-database / steel-column-profilestringSection library level 3 / level 4 names (see Gotchas).
steel-column-materialstringColumn grade — per-code list.
steel-baseplate-width / -height / -thicknessnumberPlate size (length units).
steel-baseplate-materialstringPlate grade — per-code list (differs from the column list).
steel-baseplate-grouting-thicknessnumberGrout pad thickness.
steel-foundation-width / -height / -thicknessnumberConcrete pedestal / footing size.
steel-foundation-materialstringConcrete grade — per-code list.
use-cracked-concretebooleanAssume cracked concrete.
custom-column-fy, -fu, custom-bp-fy, -fu, custom-conc-fcnumberAlways present; read only for a Custom material.

Code-only keys (steel-column-height, grout-material-selected, steel-grouting-material, steel-column-rot) are listed in the Canadian and Europe reference files.

anchors.data

KeyTypeDescription
anchor-patternstringSee pattern table below.
anchor-prop-diamstringDiameter — per-code list ("12", "M12", "1/2", "12.7" …).
anchor-prop-materialstringAnchor grade — per-code list.
anchor-prop-lengthnumberEmbedment length. Must fit inside steel-foundation-thickness (else a conflict).
anchor-prop-endingstringstraight, rectangle, circular, hook (hook American/Canadian only).
anchor-prop-side-dim / anchor-prop-thk-dimnumberEmbedded plate side (or diameter) and thickness — rectangle/circular ends. Side ≥ 4 × diameter or the call hangs. Plates must not overlap at the chosen spacing.
hook-direction / anchor-prop-hook-lengthstring / numberhook end only.
anchor-numbersnumberAnchors per side for the pattern.
anchor-numbers-z / -ynumberAnchor count per direction (All Sides-type patterns).
anchor-spacing-z / -ynumberAnchor spacing per direction.
anchor-edge-distance-z / -ynumberAnchor to plate edge.
line-anchor-edge-distance-z / -ynumberEdge distance for line anchors.
anchor-thread-includedstringincluded in every sample.
anchor-web-bendingstringweb-bending or flange-bending (I-sections; not used by Europe).
use-welded-plate-washers / anchor-plate-washer-thicknessboolean / numberNot used by Europe.
anchor-hole-clearancestringEurope only.
custom-anchor-fy / -funumberAlways present; read only for a Custom material.
steel-column-shapeAllowed anchor-pattern
i-shapeFour Corners, Flange Only, Web Only
rectangularFour Corners, Top/Bottom Only, Left/Right Only, All Sides
pipeFour Corners

For a fixed base the anchors must sit in the tension zone — Web Only under moment returns a conflict.

welds.data

KeyTypeDescription
weld-typestringfillet or cjp.
welds-column-matstringElectrode — per-code list. Custom uses custom-weld-fexx.
box-weld-sizenumberWeld size for pipe / rectangular columns.
input_table_col_weld_sizearrayI-sections: rows [rowId, element, side, size], e.g. [[1,"Top Flange","Both",9],[2,"Bottom Flange","Both",9],[3,"Web","Both",9]]. Use one size for all three rows. [] for other shapes.
use_welds_for_compstring"true" / "false" (a string) — compression through the welds instead of direct bearing.
weld-setbacknumberSetback near I-section fillet radii.
as-weld-categorystringAustralian only.

loads

An array of load cases. Give factored (ULS / LRFD) combinations — the factors in factors are resistance factors only.

KeyTypeDescription
lcstringCase label. Each check's lc_number is the 1-based position in this array of its governing case, not the label (verified).
NxstringAxial — positive = compression, negative = tension. Force units.
MzstringStrong-axis moment. Moment units. Required non-zero for fixed.
MystringAlways "0" (see Gotchas).
VystringStrong-axis shear. Force units.
VzstringWeak-axis shear. Force units.
moment_labelstring"" — auto-determined.

detailing and design_settings

detailing flags (true enables the check; a failed enabled check hangs the call):

KeyCheck
weld_sizeWeld size within code min/max.
anchor_clearanceRoom for washers / nut tightening near welds and the column.
bp_edge_distanceMinimum anchor-to-plate-edge distance.
embed_plateEmbedded plate side ≥ 4 × anchor diameter (rectangle/circular).
concrete_splittingMinimum spacing / cover against splitting (not applied for Australian).
min_anchorsAt least 4 anchors.

design_settings change the method — only change them with review by a suitably qualified engineer; keep the sample values otherwise. Which ones apply to which code is in the reference files.

KeyEffect
neglect_concrete_breakout_for_tension / _shearSkip breakout — only if separately-checked reinforcement carries the load.
neglect_concrete_pryoutSkip pryout (slender anchors, h_ef > 12d).
distribute_shear_to_allfalse = only edge anchors take shear (conservative).
simplified_approach_shear, consider_both_directions, include_embedded_head_radius, use_sci_for_weldsCode-specific method switches — see the reference file.

Reading the response

response.data holds one key per applicable check, e.g. "Concrete Breakout Capacity (Tension Load)": { "demand": 27.511, "capacity": 33.143, "ratio": 0.83, "units_on_UI": "force", "lc_number": 1 }, plus the non-check keys version, file_name, reports (html_view_link, html_download_link, pdf_download_link) and, for Europe, rotational_stiffness.

There is no pass/fail or governing-ratio field, and the set of check keys depends on code, support type and which load components are non-zero (shear adds five shear checks, tension adds the anchor checks). Never look up a fixed key name — scan:

const data = res.response.data;
const checks = Object.entries(data)
  .filter(([, v]) => v && typeof v === 'object' && typeof v.ratio === 'number')
  .map(([name, v]) => ({ name, ...v, evaluated: v.capacity !== 0 }));
const evaluated = checks.filter(c => c.evaluated);
const governing = evaluated.reduce((a, c) => (!a || c.ratio > a.ratio ? c : a), null);
const passes = evaluated.every(c => c.ratio <= 1);

units_on_UI is the kind of quantity (force, stress, length, moment, force_per_unit_length, …, "" = unitless) in your units — it varies per code for the same check.

On status: 1 the reason is in arrays next to msg (HTML strings — strip tags before showing):

FieldSeen for
conflictsFixed base without Mz; no anchors in the tension zone; embedded plates overlapping; anchor longer than the foundation; welds overlapping.
errors / warningsEmpty in every failure observed so far — still read them.
(all empty)Bad section name ("unknown reason") or a timeout — see Gotchas.

Minimal working example

Verified live: American, metric, pinned pipe column, 100 kN compression (governing ratio 0.17).

{
  "design_code": "American",
  "support_type": "pinned",
  "units_data": {
    "first_init": true, "units": "metric", "units_length": "mm", "axial_f_units": "kN",
    "units_strength": "MPa", "units_strength_steel": "MPa", "bending_f_units": "kN-m",
    "length_factor": 1, "strength_factor": 0.00689476, "strength_factor_steel": 6.89476,
    "to_mm": 1, "to_in": 1, "kNm_Kipft": 1, "kN_Kip": 1
  },
  "project_details": { "project_units": "metric", "company": "", "designer": "", "project_name": "", "project_id": "", "project_notes": "", "client": "" },
  "steel_parts": { "data": {
    "custom-column-fy": 240, "custom-column-fu": 400, "custom-bp-fy": 240, "custom-bp-fu": 400,
    "custom-conc-fc": 20, "use-cracked-concrete": true,
    "steel-column-shape": "pipe", "steel-column-database": "Pipes", "steel-column-profile": "Pipe6STD",
    "steel-column-material": "A53 grB",
    "steel-baseplate-width": 300, "steel-baseplate-height": 300, "steel-baseplate-thickness": 20,
    "steel-baseplate-material": "A36", "steel-baseplate-grouting-thickness": 0,
    "steel-foundation-material": "20.68", "steel-foundation-width": 450, "steel-foundation-height": 450, "steel-foundation-thickness": 380
  } },
  "anchors": { "data": {
    "custom-anchor-fy": 240, "custom-anchor-fu": 400,
    "anchor-pattern": "Four Corners", "anchor-prop-diam": "16", "anchor-prop-material": "F1554 Gr.36",
    "anchor-thread-included": "included", "anchor-web-bending": "web-bending",
    "use-welded-plate-washers": false, "anchor-plate-washer-thickness": 0,
    "anchor-prop-length": 250, "anchor-prop-ending": "straight",
    "anchor-numbers": 1, "anchor-numbers-z": 2, "anchor-numbers-y": 2,
    "anchor-spacing-z": 200, "anchor-spacing-y": 200,
    "anchor-edge-distance-z": 50, "anchor-edge-distance-y": 50,
    "line-anchor-edge-distance-z": 50, "line-anchor-edge-distance-y": 50
  } },
  "welds": { "data": {
    "box-weld-size": 8, "input_table_col_weld_size": [], "custom-weld-fexx": 482,
    "use_welds_for_comp": "false", "weld-type": "fillet", "weld-setback": 0, "welds-column-mat": "E70xx"
  } },
  "loads": [ { "lc": "1", "Mz": "0", "My": "0", "Nx": "100", "Vz": "0", "Vy": "0", "moment_label": "" } ],
  "factors": {
    "concrete_bearing_factor": 0.65, "steel_bearing_factor": 0.75, "steel_flexure_factor": 0.9,
    "weld_factor": 0.75, "steel_tension_factor": 0.9, "steel_shear_rupture_factor": 0.75,
    "anchor_tension_factor": 0.75, "anchor_shear_factor": 0.65, "anchor_bolts_factor": 0.75,
    "concrete_tension_factor": 0.7, "concrete_shear_factor": 0.65, "concrete_normal_weight_factor": 1
  },
  "detailing": { "weld_size": true, "anchor_clearance": true, "bp_edge_distance": true, "embed_plate": true, "concrete_splitting": true, "min_anchors": true },
  "design_settings": {
    "neglect_concrete_breakout_for_tension": false, "neglect_concrete_breakout_for_shear": false,
    "neglect_concrete_pryout": true, "distribute_shear_to_all": true, "simplified_approach_shear": true,
    "consider_both_directions": false, "include_embedded_head_radius": false, "use_sci_for_welds": false
  },
  "version": 2
}

Feeding S3D results into a base plate check

  1. Solve the frame in s3d-api (its own S3D.session.start session — a separate request from the base plate one). Don't use result_filter to fetch reactions; read them from the full results as described in analysis-results.
  2. For each factored load combination, take the column's member forces at its base station (local axes; bending_moment_z = strong axis) and write one loads entry: Nx ← axial, Mz ← strong-axis moment, Vy ← shear_force_y, Vz ← shear_force_z, My ← "0". Convert to the base plate's units.
  3. Confirm the sign before trusting it: Nx is positive for compression here, and the S3D sign convention is not documented in these skills. Run one gravity-only combination — the column must come out with Nx > 0. If it doesn't, negate axial for every case.
  4. My is unsupported — flag a significant weak-axis moment to the user rather than dropping it. A fixed base needs Mz ≠ 0 in every case; never invent a nominal moment to get past that.
  5. Use section-selector to get the column's database/profile names, and hand the finished results to qa-engineer for review.

Worked examples

Verified request/response pairs (re-run live 2026-09-22, results unchanged):

CodeSupportLoadFiles
AmericanfixedMz = 10 kN-m — full tension-side check setinput.js, response.json
AustralianpinnedNx = 100 kN — compression-only setinput.js, response.json
CanadianfixedMz = 10 kN-m — full tension-side check setinput.js, response.json
EuropepinnedNx = 100 kN — compression set + rotational_stiffnessinput.js, response.json

Copy the design_obj literal from each input.js. The American and Canadian samples have breakout ratios of 0.83 / 0.976 — little margin if you only raise the loads.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.