# Facility Design Matrix — www.facilitydesignmatrix.com > Apex marketing site. The designers themselves run on each workspace's own subdomain (https://.facilitydesignmatrix.com); the manifest paths in the designer section below are relative to a designer host. Host-independent access: the MCP server's list_designers / get_capabilities tools. ## Site pages - https://www.facilitydesignmatrix.com/designers — every designer, grouped (gyms and fitness, batting cages, courts and turf, fields and sports complexes) - https://www.facilitydesignmatrix.com/features — what the designer does (3D layout, take-offs, quoting, AI Design Assistant) - https://www.facilitydesignmatrix.com/brands — white-label designers for brands, dealers and builders - https://www.facilitydesignmatrix.com/pricing — plans from the live plan catalog - https://www.facilitydesignmatrix.com/signup — create an account (required before any designer changes a design) - https://www.facilitydesignmatrix.com/sitemap.xml --- # Facility Design Matrix — designer capabilities for AI agents > Web-based 3D facility designers (gym, batting cages, indoor courts, turf, outdoor fields, and boat / RV storage facilities) that price real products from a live catalog. An AI agent can operate every designer through the browser, and the gym-engine designers also expose an in-page API (window.FDM_AGENT) plus a JSON Design Spec. ## Machine-readable manifests - /llms-full.txt — this file plus every verb of every designer in one document - /capabilities.json — index of every designer and its manifest ### Sports - /indoor-gym/capabilities.json — Indoor Gym Designer (116 verbs) - /indoor-baseball-softball/capabilities.json — Indoor Batting Cage Designer (114 verbs) - /indoor-courts/capabilities.json — Indoor Court Designer (127 verbs) - /field-house/capabilities.json — Field House Designer (127 verbs) - /indoor-turf/capabilities.json — Indoor Turf Designer (45 verbs) - /ui_kits/fdm_designer/verticals/baseball/capabilities.json — Baseball / Softball Field Designer (25 verbs) - /ui_kits/fdm_designer/verticals/soccer/capabilities.json — Soccer Field Designer (25 verbs) - /ui_kits/fdm_designer/verticals/football/capabilities.json — Football Field Designer (25 verbs) - /ui_kits/fdm_designer/verticals/lacrosse/capabilities.json — Lacrosse Field Designer (25 verbs) - /ui_kits/fdm_designer/verticals/rugby/capabilities.json — Rugby Field Designer (25 verbs) - /ui_kits/fdm_designer/verticals/field-hockey/capabilities.json — Field Hockey Designer (25 verbs) - /ui_kits/fdm_designer/verticals/sand-volleyball/capabilities.json — Sand Volleyball Court Designer (25 verbs) - /ui_kits/fdm_designer/verticals/bocce/capabilities.json — Bocce Court Designer (25 verbs) - /ui_kits/fdm_designer/verticals/pickleball/capabilities.json — Pickleball Court Designer (25 verbs) - /ui_kits/fdm_designer/verticals/putting-green/capabilities.json — Putting Green Designer (25 verbs) - /ui_kits/fdm_designer/verticals/sports-complex/capabilities.json — Sports Complex Designer (31 verbs) - /turf-halo/capabilities.json — Turf Halo Designer (25 verbs) ### Industrial - /boat-rv-storage/capabilities.json — Boat & RV Storage Facility Designer (36 verbs) ## How to drive a designer (browser agent, Mode A) 1. Open the designer URL (e.g. /indoor-gym/, /indoor-courts/?sport=combo). 2. Read window.FDM_AGENT.capabilities() or the manifest above for verbs and units (feet, degrees, USD). 3. Call verbs: await window.FDM_AGENT.call('fdm.set_room', { widthFt: 60, depthFt: 80, heightFt: 18 }). 4. Or open the page with ?spec=, or use the "AI / Spec" panel (bottom-right) — the panel is hidden from human visitors: reveal it with ?agent=1 on the URL or window.FDM_AGENT.showPanel(). 5. Read results with fdm.get_summary, fdm.get_bom, fdm.get_pricing; run fdm.classify_commercial_path before talking money. 6. High-impact verbs (save, submit for quotation, purchase link) require confirm:true after the human agrees. ## MCP server (Mode C, read-only recommender) - Endpoint: https://cecolrwlazewaxwxohkq.supabase.co/functions/v1/fdm_mcp (MCP Streamable HTTP, JSON-RPC 2.0 over POST, no auth) - Tools: list_designers, get_capabilities(vertical), make_design_link(vertical, spec) -> deep link that opens the designer with the Design Spec applied, describe_platform - The MCP tools read these manifests, so they never drift from the in-page API. Pricing, saving, quotations and purchases happen in the person's browser. ## Commercial policy Simple designs from stock products can be purchased; designs with netting, wall padding, custom charges, several flooring zones or over $15,000 go to a custom quotation reviewed by a person. The classifier explains which. ## Access and plans (registration required) Every designer requires a registered, signed-in person who has accepted the Terms of Use and Privacy Policy. Anyone can register; the free registration plan is limited (see plans). There is no unlimited free tier and no free AI Design Assistant. - How: open any designer URL in the person's browser - the sign-in / create-account gate appears first; creating the account accepts the Terms of Use (https://www.facilitydesignmatrix.com/terms) and Privacy Policy (https://www.facilitydesignmatrix.com/privacy). Sign up: https://www.facilitydesignmatrix.com/signup - Before the person is signed in: Read-only verbs (describe_capabilities, get_design, get_summary, get_bom, get_pricing, validate_design, classify_commercial_path, list_*, get_access_status) work for anyone; every verb that changes a design returns REGISTRATION_REQUIRED until the person is signed in. - Check state with fdm.get_access_status (registered? plan? saved designs left?). A refused verb returns error.code REGISTRATION_REQUIRED with access.registerUrl - send the person there, then call again. A ?spec= link is held and applied automatically after sign-in. - Plans (from the live plan catalog): - Choose a plan (FREE REGISTRATION PLAN, free): 0 saved designs. Pick a plan to start your 7-day trial; 5 designs during the trial; Card required at checkout; Cancel anytime. - Solo Designer (UPGRADE, $19/mo or $179/yr): 50 saved designs. Up to 50 saved designs; Live Kodiak Sports catalog; PDF quote export; Email support; AI Design Assistant available (+$20/mo per user); Cancel anytime; 7-day trial, card required. - Designer Plus (UPGRADE, $59/mo or $590/yr): unlimited saved designs. Unlimited designs; Designs saved for 3 years; PDF export; Priority email support; AI Design Assistant available (+$20/mo per user); Cancel anytime; 7-day trial, card required. - Enterprise (UPGRADE, $399/mo or $3990/yr): unlimited saved designs. Multi-user team; Custom tool branding; Your own branded subdomain (yourbrand.facilitydesignmatrix.com); Dedicated support - priority response; AI Design Assistant available (+$20/mo per user); Cancel anytime; No self-serve trial - talk to sales. - AI Design Assistant (ADD-ON, $20/mo): adds to any paid plan. Design Assistant chat in every designer; Builds, prices and explains designs for you; 3,000,000 tokens per user per month; $20/month per user, on any paid plan. - Upgrades: Upgrades and the AI Design Assistant add-on are bought in My Account (Account button, top right of every designer) or at https://www.facilitydesignmatrix.com/pricing; billing by Paddle. Pricing: https://www.facilitydesignmatrix.com/pricing - Previews and videos: none published yet. --- # Agent capabilities — full verb reference Generated by `node scripts/gen-capabilities.mjs` from the in-page verb registry (`window.FDM_AGENT`). The pre-commit hook fails when this file, `capabilities.json`, `llms.txt` or `llms-full.txt` are stale (architecture §3B, §3C: every designer change updates the agent layer in the same commit). Units: feet, degrees, USD. Positions: equipment + cages are room-centered (x east, z south); floor zones are room-local from the north-west corner. Walls: north = back, south = front (entry), east = right, west = left. Every verb is called the same way in every mode: `await window.FDM_AGENT.call('fdm.', { ...args })` in the page, `{fdm:'agent', id, verb, args}` over postMessage, or (Phase 3) the MCP tool of the same name. High-impact verbs return `CONFIRMATION_REQUIRED` until called with `confirm:true` after the human agrees. ## Indoor Gym Designer (`indoor-gym`) URL: `/indoor-gym/` — manifest: `/indoor-gym/capabilities.json` — 116 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.add_cage` | mutate | Add batting/practice netting cages. Sizes in feet (lengthFt = hitting direction, widthFt = one lane). lanes > 1 builds ONE shell of that many side-by-side lanes (width = lanes x widthFt) with sliding dividers - the normal way to do "6 cages 70 x 15". count > 1 builds separate cages side by side. Orientation is picked automatically so the footprint fits the building; an orientation or wall that cannot fit is corrected and reported in adjusted. Hitting mats auto-place (one per lane) - never add them separately. | lengthFt, widthFt, lanes, heightFt, count, alongWall, position, rotationDeg, netWeight | | `fdm.add_door` | mutate | Add a door on an exterior wall (max 3). Kinds: single-glass, single-wood, double-glass (default), overhead (commercial roll-up), garage (residential sectional). Place with position 0..1 or alongFt. | wall*, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.add_enclosure_door` | mutate | Add an entry door to a field enclosure: side, position along that side (door centre in feet), width / kind (player 4 ft, double 8 ft, gate 12 ft). Rendered as a framed door leaf in the boards (or a zip door in a net-only enclosure). | zoneId*, side*, alongFt*, widthFt, kind | | `fdm.add_floor_zone` | mutate | Add a floor zone (turf strip, rubber area, fitness area, court surface, etc.). Give a product (floor id / Shopify handle / name) and either a rect or a wall to run along. kind fitness = rubber-floored gym area: strength and cardio equipment is PLACED THERE BY DEFAULT (product optional - defaults to rubber). | product, kind, label, rect, alongWall, lengthFt, widthFt, replace | | `fdm.add_interior_wall` | mutate | Add a freestanding interior wall inside the room (partial or full height - half walls, dividers, a wall to hang signage on). Up to 3, 6 in thick. Give the center, orientation, length and height; paint each side; put lettering on a side with add_signage using interiorWall + side. | orientation, center*, lengthFt*, heightFt, finish, finishSide1, finishSide2 | | `fdm.add_net_door` | mutate | Add a zip-up entry door (yellow outline) to a netting cage. Pick the side and location on that side; with dividers, lane = which sub-cage (1 = leftmost). | cageId, side, location, slot, lane | | `fdm.add_net_panel` | mutate | Add a freestanding netting panel / divider curtain (a flat wall of net, hung from the ceiling structure). Use it to split areas, back a driving range line, or protect walls. Position is the panel center, room-centered feet; rotation 0 = the panel runs east-west. | widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.add_post_grid` | mutate | Generate an evenly spaced grid of vertical support posts (building columns). Existing posts are re-seated onto the new grid so their pads survive; surplus posts are removed. Posts block nothing by themselves but can be padded (pad_posts). | cols*, rows*, spacingXFt, spacingZFt, shape, sizeIn, offsetXFt, offsetZFt | | `fdm.add_pt_inlay` | mutate | Add a PT training inlay to a turf zone (types / params from list_pt_inlays). Placed at the zone centre (offsetFt moves it; +x right, +z toward the front wall), long axis along the zone's long axis unless rotDeg is given. Colours by name or hex from list_pt_inlays. Zone must be Pro Performance 45 - pass switchToPP45:true to switch it first. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, type*, params, lineColor, numberColor, rotDeg, offsetFt, switchToPP45 | | `fdm.add_room` | mutate | Add an enclosed room - bathroom, offices, showers or unusable space (dock). It is a non-billable locked area: flooring is excluded, equipment cannot sit on it, walls behind it are locked. Place it in a corner or against a wall. Returns equipmentInside so you can move anything already there. | kind*, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.add_signage` | mutate | Put lettering on a wall: aluminum letters (optionally with a colored backlight halo / glow behind them), painted letters (any paint color, e.g. neon green) or neon tube letters (neon colors). Walls: north = Wall 1 (back), east = Wall 2 (right), south = Wall 3 (front), west = Wall 4 (left). Centered on the wall unless a position is given. | wall, interiorWall, side, text*, material*, color, backlight, letterHeightFt, position | | `fdm.add_wall_item` | mutate | Mount a specialty wall panel on an exterior wall: band-wall (resistance band anchor wall) or slam-wall (slam / med ball wall). 10x10 ft max, 3 in thick. | kind*, wall*, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.add_wall_padding` | mutate | Add wall padding sections to a wall: height in feet, optional run length (default = full wall), color from the live pad catalog. | wall*, heightFt, lengthFt, offsetFt, fromFloorFt, color | | `fdm.add_window` | mutate | Add a window on an exterior wall (max 3). Every window shows a landscape backdrop from inside. | wall*, kind, position, alongFt | | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.apply_home_gym_preset` | **high-impact** (confirm:true) | HIGH IMPACT: replace the whole design with one of the pre-designed HOME gym layouts (list_home_gym_presets), re-packed for the current room: floor, wall paint / mirror / mural, optional 5 ft turf strip, wall items and equipment. Gear we do not carry is placed as a $0 non-billable placeholder under Misc. | preset*, confirm | | `fdm.apply_layout_recipe` | **high-impact** (confirm:true) | HIGH IMPACT: replace all equipment with a complete recipe layout sized to the room (e.g. commercial-gym). Uses a saved template for this room size when one exists. | recipe, confirm | | `fdm.apply_pt_clinic` | mutate | Apply a pre-built PT clinic design to a turf zone: switches it to Pro Performance 45 (Florida Blue unless keepTurfColor) and REPLACES its PT inlays with the clinic pieces (editable afterwards with set_pt_inlay). fits:false means the zone is smaller than the layout. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, clinicId*, lineColor, numberColor, keepTurfColor | | `fdm.apply_turf_concept` | mutate | Put a Pre-Built Design Concept on a turf zone (list_turf_concepts). kind ez = art in both end zones (yard lines / hash marks stay separate add-ons via set_zone_markings), full = one graphic over the whole zone. line1 up to 12 letters, line2 up to 16. Colors by name or hex from list_turf_concepts colors. Zone must be Pro Performance 45 - pass switchToPP45:true to switch the zone's turf (same color when available). | zoneId*, design, kind, line1, line2, accentColor, textColor, switchToPP45 | | `fdm.arrange_equipment` | mutate | Re-lay the equipment already on the floor by the commercial-gym rules (racks along the north wall facing in, one bench inside each rack, plate-loaded and selectorized rows, dumbbell/kettlebell racks in a linear row, cardio along the front, clearances and aisles kept, nothing on turf). Columns and wall-mounted items stay. Undoable. | ids, nearWall | | `fdm.classify_commercial_path` | read | Decide whether this design is a simple purchase or needs a custom quotation, with reasons (policy §3A). | | | `fdm.clear_design` | **high-impact** (confirm:true) | Remove everything but the building: equipment, cages and net panels, floor zones and enclosed rooms, wall padding, signage and wall items, doors, windows, interior walls, field enclosures, the running track and the upper floor (room size kept; the base floor stays). | confirm | | `fdm.clear_turf_concept` | mutate | Remove the Pre-Built Design Concept from a turf zone (field lines stay). | zoneId* | | `fdm.create_purchase_link` | **high-impact** (confirm:true) | HIGH IMPACT: for a purchase-path design, build the checkout handoff. Returns the material list; on this page the human completes checkout on kodiaksports.com. | confirm | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Open the PDF export. Landscape document in this order: quote page (facility, spec, estimated total, clickable contents), bill of materials grouped by family with flooring installation details, equipment summary with photos, then the 3D views. The human confirms the download. | | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_ceiling` | read | Read the ceiling lighting setup (downlights, hex island, linear, wall accent, perimeter, daylight). | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_elevated_track` | read | The running track: on/off, level (elevated mezzanine or ground level on the slab), width, height, walls, column spacing, surface, rail, lanes, stairs, plus the takeoff (surface sq ft, lap length and laps per mile, lanes, columns, guardrail feet, stairs, inside-edge feet), warnings (low ceiling, stair fit, track over a court or zone) and price (surface only; structure / lines quoted separately). | | | `fdm.get_enclosure` | read | One field enclosure by zone: settings, doors, takeoff (perimeter, boards lf, glass and net sq ft, posts, doors) and warnings. | zoneId* | | `fdm.get_layers` | read | Canvas view layers for this page (equipment, flooring, vertical posts, netting, exterior walls, interior walls, ceiling and lights, labels, measurements) with their on / off / mixed state, sub-toggles, and the current camera view. View-only - hiding a layer never removes anything from the design or the quote. | | | `fdm.get_levels` | read | Building levels: which level is being edited (1 = ground, 2 = upper floor / mezzanine plan), the view (l1 / l2 / both), whether Level 2 exists, and a Level 2 summary (deck size, items, zones, equipment lines). | | | `fdm.get_parent_link` | read | Whether this design is linked to a Sports Complex building (opened from Edit / design it on the complex plan). Linked designs send their building size (room width / depth / height) back to the complex plan once saved. Returns the complex design id, building slot and the link back to the complex. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.get_upper_floor` | read | The upper floor / mezzanine: on/off, coverage (mezzanine along one wall or full 2nd floor), wall, depth, length, level-2 height, upstairs clear height, stairs, elevator, finish, use, plus the takeoff (deck and usable sq ft, columns, guardrail, stairs, elevator), warnings (low building, courts under a low deck, track conflict, no elevator / accessibility, single exit) and price (finish only; structure quoted separately). | | | `fdm.list_cages` | read | List netting cages. | | | `fdm.list_designs` | read | The signed-in user's saved designs, newest first. | limit | | `fdm.list_doors` | read | List doors (wall, kind, position along the wall, size). | | | `fdm.list_enclosures` | read | Field enclosures (glass dasher boards / containment netting with doors) on this level, plus which zones can take one. Design elements only - never priced. | | | `fdm.list_equipment` | read | List placed equipment. | | | `fdm.list_home_gym_presets` | read | The 7 pre-designed HOME gym layouts (CrossFit / Garage Box, Cardio + Glam Lift, Pilates + Yoga + Strength, Heavy Iron Strength, Athlete Performance, Boxing + HIIT, General Gym) with the item plan each would place in the CURRENT room size, which items would be non-billable placeholders (gear not carried), and which are skipped because the room is too small. | | | `fdm.list_interior_walls` | read | List interior walls with their sides (which way each side faces, its finish, and the signageWall key to use for lettering). | | | `fdm.list_layout_recipes` | read | Recipes apply_layout_recipe accepts, plus the layout guide (rules the engine follows). | | | `fdm.list_netting` | read | List all netting: cages (with dividers, baffles, doors, color) and freestanding panels. Remove a panel or cage with remove_object. | | | `fdm.list_posts` | read | List vertical posts / structural columns with their positions and pad config. | | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical and, for gyms, by category home / garage / commercial - the same chips the human sees. | category, vertical | | `fdm.list_products` | read | Search the live catalog this page can design with. kind = floor / equipment / wall-finish / wall-pad / net-system. Returns ids to pass to other verbs. | kind*, query, category, limit | | `fdm.list_pt_clinics` | read | Pre-built PT CLINIC turf designs on Pro Performance 45: Signature Clinic - Logo Centre (Navy turf, White lines, ladders + target ring + hopscotch, logo slot in the centre that the human uploads, edge ticks on the turf designer), plus Florida Blue layouts: agility lane, balance & gait, full rehab suite, pediatric play, return to sport. Each = a set of PT training inlays laid down the zone long axis; recommendedAreaFt is the best-fit turf area. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_pt_inlays` | read | PT / athletic-training turf inlays (cut into the turf, colour configurable): agility ladder (boxes x 1-3 rows), agility dots, numbered markers, numbered hopscotch (classic / pairs / 3x3 grid), star-excursion balance star, four-square grid, clock-face targets, three-direction (Y) reach, zigzag path, figure-eight path, footprint stepping path, measured walking lane, jump-distance lane. Made ONLY on Pro Performance 45 turf. Price: 2500 USD custom charge once per turf zone when any inlay is present, plus a per-piece price (own lines in the quote). Returns the catalog with each type's parameters, the inlay colours, and every turf zone with its inlays. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_racks` | read | Racks and rigs on the floor with their numbered labels (targets for mount_in_rack). | | | `fdm.list_rooms` | read | List enclosed rooms (bathroom / offices / showers / unusable) with their rectangles and any equipment sitting inside them. | | | `fdm.list_signage` | read | List wall lettering / signs. | | | `fdm.list_track_surfaces` | read | Floor products that can be the running surface of the running track (elevated or ground level): Track Flooring OSST (OSSTrax-Elite, 10 colors, pricing pending until its Shopify item is live), Rolled Rubber and Sports Turf from the live catalog, with $/sq ft. | | | `fdm.list_turf_concepts` | read | The 10 Pre-Built Design Concepts for turf zones (end-zone or full-pad inlay graphics with the customer's own two lines of text, auto-scaled to any turf size). Made ONLY on Pro Performance 45 turf. Price: full pad = $7/sq ft on all the zone's turf; end zones = $7/sq ft on the end-zone area only; $3,500 minimum. Also returns the inlay colors and each turf zone's current concept. | | | `fdm.list_upper_floor_finishes` | read | Floor products that can finish level 2 of the upper floor / mezzanine (Rolled Rubber, Sports Turf, Sport Vinyl, Track Flooring from the live catalog) with $/sq ft. | | | `fdm.list_wall_items` | read | List mounted specialty wall panels (band walls, slam walls). | | | `fdm.list_walls` | read | Current wall finishes, wainscot and padding sections. | | | `fdm.list_windows` | read | List windows (wall, kind, position along the wall, size). | | | `fdm.list_zones` | read | List floor zones with products and rectangles. | | | `fdm.mount_in_rack` | mutate | Put a placed barbell in a rack's J-hooks (or take it out). The bar sits across the uprights at squat height and moves with the rack. Racks and bars can be named by their numbered label ("Power Rack 2", "Barbell 1") or placement id - see list_equipment label / list_racks. Visual only; the quote is unchanged. | id*, rack* | | `fdm.move_object` | mutate | Move equipment / cage / zone by id. Equipment and cages: room-centered feet. Zones: room-local NW-origin feet. | id*, position* | | `fdm.open_design` | **high-impact** (confirm:true) | Open one of the saved designs (replaces everything currently on screen - save first if it matters). A design made in a different designer is refused with WRONG_VERTICAL, which names that designer and returns the link to open it there - this page never navigates away mid-call. | id*, confirm | | `fdm.pad_posts` | mutate | Wrap posts in safety padding (sold per vertical foot). Colors: black, navy, royal, forest, maroon, red, gray, purple, sky, tan, kelly, yellow. | posts, color, diameterIn, graphics, heightFt | | `fdm.paint_floor` | mutate | Paint a rectangle of floor squares with a flooring product (or erase paint). Painted squares sit on top of every zone and bill as a second area of that flooring - use it for cut-outs, borders and odd shapes a rectangular zone cannot do. erase:true removes paint in the rect so the zone / primary floor underneath shows again. | product, rect*, erase | | `fdm.place_equipment` | mutate | Place a catalog product (id / Shopify handle / SKU / archetype / name). Omit position and the layout engine finds a free, rule-abiding spot: LIKE KINDS GO IN ROWS (each kind - treadmills, rowers, squat racks, functional trainers - forms its own straight row, extended as you add more; use count:N for one clean row), racks on the north/back wall facing in, dumbbell + kettlebell racks in a linear row on a side wall, cardio rows along the front, clearances kept, nothing on turf. Use nearWall to prefer a wall, inRack:true to put a bench INSIDE the next rack without one. Give position only when the customer named a spot. | product*, position, rotationDeg, count, nearWall, inRack, force | | `fdm.redo` | mutate | Redo the last undone change (same as Ctrl+Y). | | | `fdm.remove_door` | mutate | Remove a door. | id* | | `fdm.remove_elevated_track` | mutate | Turn the running track off, elevated or ground level (its settings are kept if it is turned back on). | | | `fdm.remove_enclosure_door` | mutate | Remove one entry door from a field enclosure. | zoneId*, doorId* | | `fdm.remove_field_enclosure` | mutate | Remove the dasher boards / containment netting from a zone (the zone itself stays). | zoneId* | | `fdm.remove_interior_wall` | mutate | Remove an interior wall (and any signs on it). | id* | | `fdm.remove_net_door` | mutate | Remove a cage entry door by its number (from list_netting). | cageId, number* | | `fdm.remove_object` | mutate | Remove equipment / cage / zone / wall pad section by id. | id* | | `fdm.remove_posts` | mutate | Remove vertical posts (and their padding). posts = all, or a list of numbers / ids. | posts | | `fdm.remove_pt_inlay` | mutate | Remove one PT training inlay (inlayId) or all of them on a zone (all:true). | zoneId*, inlayId, all | | `fdm.remove_room` | mutate | Remove an enclosed room (the floor under it becomes designable again). | id* | | `fdm.remove_signage` | mutate | Remove a sign by id. | id* | | `fdm.remove_upper_floor` | mutate | Turn the upper floor / mezzanine off (settings kept if turned back on). A building height raised automatically for it is restored. | | | `fdm.remove_wall_item` | mutate | Remove a specialty wall panel. | id* | | `fdm.remove_window` | mutate | Remove a window. | id* | | `fdm.rotate_object` | mutate | Rotate equipment / cage by degrees (absolute). | id*, rotationDeg* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save the design to the signed-in account (My Designs). | confirm, name | | `fdm.set_base_floor` | mutate | Set the base flooring that covers everything outside zones. | product* | | `fdm.set_cage` | mutate | Resize or re-spec a cage: size, net weight (36/42/60/72/96), net color (blue, black, green, white), divider count and orientation, front/back baffles. | cageId*, lengthFt, widthFt, heightFt, dividers, dividersRotated, netWeight, color, baffleFront, baffleBack | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D orbit), top (floor plan), walk (eye level), front, back, corner-fl, corner-fr, lookup (ceiling), or iso (reset). View-only. | view* | | `fdm.set_ceiling_lighting` | mutate | Configure the ceiling light systems. Any mix of: downlights (grids of can lights over floor zones), hexGrid (hexagonal LED island), linear (LED strip), wallAccent (wall wash from the ceiling), perimeter (LED strip along the wall/ceiling seam), plus daylight (1 sun .. 0 night), brightness, and visible (show/hide the whole ceiling). Omit a system to leave it alone; {on:false} turns it off. | downlights, hexGrid, linear, wallAccent, perimeter, daylight, brightness, visible | | `fdm.set_elevated_track` | mutate | Add or change the running track around the room. level elevated (default: a wall-attached mezzanine with support columns to the floor) or ground (the same loop laid on the slab: surface + lane lines + inside-edge transition, no deck / columns / rail / stairs; heightFt, postSpacingFt, railing and stairs are ignored; floor zones must sit inside the loop). Any field is optional; enabled:true turns it on. widthFt 6-20, heightFt 10-20 (default 15), postSpacingFt 10-30 (default 25), cornerRadiusFt 0-40 (default 12: inside corners are rounded where two sides meet, lane lines and rail run as one continuous loop; clamped to fit the room), walls = which walls it runs along (north/east/south/west; all four = full loop), surfaceFloorId from list_track_surfaces, stairs 0-4, firstStairWall. The room needs a ceiling of heightFt + 8 ft; pass raiseCeiling:true to raise it automatically. Rectangular rooms only. | enabled, level, widthFt, heightFt, postSpacingFt, cornerRadiusFt, walls, surfaceFloorId, railing, laneLines, stairs, firstStairWall, raiseCeiling | | `fdm.set_field_enclosure` | mutate | Wrap a turf field / floor zone with glass dasher boards (soccer, lacrosse, hockey), containment netting on posts with optional top netting, or both; add entry doors in the boards. Creates the enclosure on first call; later calls change any field. Non-saleable design elements: never priced or added to the cart, listed on the PDF for the building team. | zoneId*, kind, boardHeightFt, glassHeightFt, netHeightFt, topNet, netColor, postSpacingFt, insetFt, doors | | `fdm.set_gym_type` | mutate | Switch the facility type: commercial (18 ft ceiling default) or home / garage gym (10 ft ceiling, ceiling fixtures hidden). Same defaults the Room panel applies. | type* | | `fdm.set_layer` | read | Show or hide a canvas view layer, or one of its sub-toggles (e.g. layer labels, toggle equipment_labels). Layer ids come from get_layers. Optional netColor blue / black previews the netting color. View-only. | layer*, on, toggle, netColor | | `fdm.set_level` | mutate | Switch the building level being edited. view l1 = ground floor (default), l2 = the upper floor / mezzanine plan (all floor, equipment, padding and signage verbs then act on level 2, kept inside the deck), both = level 1 editable with level 2 shown on the deck. Needs an upper floor (set_upper_floor). | view* | | `fdm.set_placement_variant` | mutate | Switch a placed product between its display variants (visual only - same product, SKU and price in the quote). Today: barbells with a "loaded" variant show the bar WITH bumper plates on it. list_equipment / list_products show variants[] on records that have any; pass variant "none" to go back to the plain product. | id*, variant* | | `fdm.set_pt_inlay` | mutate | Change a PT training inlay: params, colours, rotation (0/90/180/270) or position (offsetFt from the zone centre). | zoneId*, inlayId*, params, lineColor, numberColor, rotDeg, offsetFt | | `fdm.set_room` | mutate | Set the building size (interior feet). Zones and equipment that no longer fit are pulled back inside. | widthFt, depthFt, heightFt, name | | `fdm.set_upper_floor` | mutate | Add or change the upper floor. coverage mezzanine (a deck along one wall: depthFt 10-150, spanPct 20-100 of that wall, centred) or full (whole footprint). wall north/east/south/west = the mezzanine wall and where stairs + elevator sit. levelFt 9-32 = level-2 floor height, upperClearFt 8-24 = upstairs ceiling; with autoCeiling (default on) the building height rises to levelFt + upperClearFt and is restored when the floor is removed. stairs 1-3 switchback stairs, elevator (accessible, default on), railing, surfaceFloorId from list_upper_floor_finishes ("" = none), use multi/fitness/offices/viewing/party/storage, show (3D visibility, view only). Rectangular buildings only. | enabled, coverage, wall, depthFt, spanPct, levelFt, upperClearFt, autoCeiling, columnSpacingFt, stairs, elevator, railing, surfaceFloorId, use, show | | `fdm.set_wainscot` | mutate | Apply a wainscot (lower band) finish to a wall or all walls. | wall, finish* | | `fdm.set_wall_design` | mutate | Put a full-wall painted mural design on a wall: brushgrit (Brush + Text), peak (Mountain Peak), hexpower (Hexagons), geometric, arrows (Chevrons), heartbeat, topo (Topographic), splatter (Impact Splatter). Colorways: red, yellow (gold), orange, green, blue, cyan (ice), purple, sage, mono. brushgrit and peak take a headline text. Use set_wall_paint to go back to plain paint. | wall, walls, design*, colorway, headline | | `fdm.set_wall_paint` | mutate | Paint / finish a wall (or all walls). finish = color name, finish id, or hex (#2a2a2a → nearest paint). | wall, finish*, walls | | `fdm.set_zone_markings` | mutate | Turf-lane markings: yard lines every 5 yards, hash marks every yard, and painted floor text along the lane (e.g. a brand name in white). Lines are white. Works on turf-lane zones from add_floor_zone / list_zones whose turf product is custom-eligible (CUSTOMTURF_Yes); stock turf returns NOT_AVAILABLE - pick a custom-eligible turf via list_products kind=floor first. | zoneId*, yardLines, hashMarks, text, textColor, textHeightFt | | `fdm.set_zone_product` | mutate | Change the flooring product of a zone. | zoneId*, product* | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: submit the current design + material list for a custom quotation (saves the design, generates the PDF, emails the quote team). Requires a signed-in user and confirm:true. | confirm, note | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.update_door` | mutate | Move a door along or to another wall, change its kind, opening height (overhead/garage) or garage width. | id*, wall, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.update_enclosure_door` | mutate | Move or re-spec an enclosure door (side, alongFt, widthFt, kind). | zoneId*, doorId*, side, alongFt, widthFt, kind | | `fdm.update_interior_wall` | mutate | Move, resize, rotate (orientation), repaint or hide an interior wall. | id*, enabled, orientation, center, lengthFt, heightFt, finish, finishSide1, finishSide2 | | `fdm.update_net_panel` | mutate | Move, resize, rotate, re-spec or add/remove the door on a netting panel. | id*, widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.update_room` | mutate | Move, resize, relabel, rotate or change the variant of an enclosed room. | id*, kind, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.update_signage` | mutate | Change a sign: text, color, backlight, letter height, position, wall (exterior or interior wall side). | id*, interiorWall, side, text, color, backlight, letterHeightFt, wall, position | | `fdm.update_wall_item` | mutate | Move or resize a specialty wall panel, or move it to another wall. | id*, wall, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.update_wall_padding` | mutate | Change one wall padding section: color, height, run length, position along the wall, or height off the floor. Remove with remove_object. | id*, color, heightFt, lengthFt, offsetFt, fromFloorFt | | `fdm.update_window` | mutate | Move a window along or to another wall, or change its kind. | id*, wall, kind, position, alongFt | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Indoor Batting Cage Designer (`indoor-baseball-softball`) URL: `/indoor-baseball-softball/` — manifest: `/indoor-baseball-softball/capabilities.json` — 114 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.add_cage` | mutate | Add batting/practice netting cages. Sizes in feet (lengthFt = hitting direction, widthFt = one lane). lanes > 1 builds ONE shell of that many side-by-side lanes (width = lanes x widthFt) with sliding dividers - the normal way to do "6 cages 70 x 15". count > 1 builds separate cages side by side. Orientation is picked automatically so the footprint fits the building; an orientation or wall that cannot fit is corrected and reported in adjusted. Hitting mats auto-place (one per lane) - never add them separately. | lengthFt, widthFt, lanes, heightFt, count, alongWall, position, rotationDeg, netWeight | | `fdm.add_door` | mutate | Add a door on an exterior wall (max 3). Kinds: single-glass, single-wood, double-glass (default), overhead (commercial roll-up), garage (residential sectional). Place with position 0..1 or alongFt. | wall*, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.add_enclosure_door` | mutate | Add an entry door to a field enclosure: side, position along that side (door centre in feet), width / kind (player 4 ft, double 8 ft, gate 12 ft). Rendered as a framed door leaf in the boards (or a zip door in a net-only enclosure). | zoneId*, side*, alongFt*, widthFt, kind | | `fdm.add_floor_zone` | mutate | Add a floor zone (turf strip, rubber area, fitness area, court surface, etc.). Give a product (floor id / Shopify handle / name) and either a rect or a wall to run along. kind fitness = rubber-floored gym area: strength and cardio equipment is PLACED THERE BY DEFAULT (product optional - defaults to rubber). | product, kind, label, rect, alongWall, lengthFt, widthFt, replace | | `fdm.add_interior_wall` | mutate | Add a freestanding interior wall inside the room (partial or full height - half walls, dividers, a wall to hang signage on). Up to 3, 6 in thick. Give the center, orientation, length and height; paint each side; put lettering on a side with add_signage using interiorWall + side. | orientation, center*, lengthFt*, heightFt, finish, finishSide1, finishSide2 | | `fdm.add_net_door` | mutate | Add a zip-up entry door (yellow outline) to a netting cage. Pick the side and location on that side; with dividers, lane = which sub-cage (1 = leftmost). | cageId, side, location, slot, lane | | `fdm.add_net_panel` | mutate | Add a freestanding netting panel / divider curtain (a flat wall of net, hung from the ceiling structure). Use it to split areas, back a driving range line, or protect walls. Position is the panel center, room-centered feet; rotation 0 = the panel runs east-west. | widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.add_post_grid` | mutate | Generate an evenly spaced grid of vertical support posts (building columns). Existing posts are re-seated onto the new grid so their pads survive; surplus posts are removed. Posts block nothing by themselves but can be padded (pad_posts). | cols*, rows*, spacingXFt, spacingZFt, shape, sizeIn, offsetXFt, offsetZFt | | `fdm.add_pt_inlay` | mutate | Add a PT training inlay to a turf zone (types / params from list_pt_inlays). Placed at the zone centre (offsetFt moves it; +x right, +z toward the front wall), long axis along the zone's long axis unless rotDeg is given. Colours by name or hex from list_pt_inlays. Zone must be Pro Performance 45 - pass switchToPP45:true to switch it first. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, type*, params, lineColor, numberColor, rotDeg, offsetFt, switchToPP45 | | `fdm.add_room` | mutate | Add an enclosed room - bathroom, offices, showers or unusable space (dock). It is a non-billable locked area: flooring is excluded, equipment cannot sit on it, walls behind it are locked. Place it in a corner or against a wall. Returns equipmentInside so you can move anything already there. | kind*, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.add_signage` | mutate | Put lettering on a wall: aluminum letters (optionally with a colored backlight halo / glow behind them), painted letters (any paint color, e.g. neon green) or neon tube letters (neon colors). Walls: north = Wall 1 (back), east = Wall 2 (right), south = Wall 3 (front), west = Wall 4 (left). Centered on the wall unless a position is given. | wall, interiorWall, side, text*, material*, color, backlight, letterHeightFt, position | | `fdm.add_wall_item` | mutate | Mount a specialty wall panel on an exterior wall: band-wall (resistance band anchor wall) or slam-wall (slam / med ball wall). 10x10 ft max, 3 in thick. | kind*, wall*, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.add_wall_padding` | mutate | Add wall padding sections to a wall: height in feet, optional run length (default = full wall), color from the live pad catalog. | wall*, heightFt, lengthFt, offsetFt, fromFloorFt, color | | `fdm.add_window` | mutate | Add a window on an exterior wall (max 3). Every window shows a landscape backdrop from inside. | wall*, kind, position, alongFt | | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.apply_layout_recipe` | **high-impact** (confirm:true) | HIGH IMPACT: replace all equipment with a complete recipe layout sized to the room (e.g. commercial-gym). Uses a saved template for this room size when one exists. | recipe, confirm | | `fdm.apply_pt_clinic` | mutate | Apply a pre-built PT clinic design to a turf zone: switches it to Pro Performance 45 (Florida Blue unless keepTurfColor) and REPLACES its PT inlays with the clinic pieces (editable afterwards with set_pt_inlay). fits:false means the zone is smaller than the layout. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, clinicId*, lineColor, numberColor, keepTurfColor | | `fdm.apply_turf_concept` | mutate | Put a Pre-Built Design Concept on a turf zone (list_turf_concepts). kind ez = art in both end zones (yard lines / hash marks stay separate add-ons via set_zone_markings), full = one graphic over the whole zone. line1 up to 12 letters, line2 up to 16. Colors by name or hex from list_turf_concepts colors. Zone must be Pro Performance 45 - pass switchToPP45:true to switch the zone's turf (same color when available). | zoneId*, design, kind, line1, line2, accentColor, textColor, switchToPP45 | | `fdm.arrange_equipment` | mutate | Re-lay the equipment already on the floor by the commercial-gym rules (racks along the north wall facing in, one bench inside each rack, plate-loaded and selectorized rows, dumbbell/kettlebell racks in a linear row, cardio along the front, clearances and aisles kept, nothing on turf). Columns and wall-mounted items stay. Undoable. | ids, nearWall | | `fdm.classify_commercial_path` | read | Decide whether this design is a simple purchase or needs a custom quotation, with reasons (policy §3A). | | | `fdm.clear_design` | **high-impact** (confirm:true) | Remove everything but the building: equipment, cages and net panels, floor zones and enclosed rooms, wall padding, signage and wall items, doors, windows, interior walls, field enclosures, the running track and the upper floor (room size kept; the base floor stays). | confirm | | `fdm.clear_turf_concept` | mutate | Remove the Pre-Built Design Concept from a turf zone (field lines stay). | zoneId* | | `fdm.create_purchase_link` | **high-impact** (confirm:true) | HIGH IMPACT: for a purchase-path design, build the checkout handoff. Returns the material list; on this page the human completes checkout on kodiaksports.com. | confirm | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Open the PDF export. Landscape document in this order: quote page (facility, spec, estimated total, clickable contents), bill of materials grouped by family with flooring installation details, equipment summary with photos, then the 3D views. The human confirms the download. | | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_ceiling` | read | Read the ceiling lighting setup (downlights, hex island, linear, wall accent, perimeter, daylight). | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_elevated_track` | read | The running track: on/off, level (elevated mezzanine or ground level on the slab), width, height, walls, column spacing, surface, rail, lanes, stairs, plus the takeoff (surface sq ft, lap length and laps per mile, lanes, columns, guardrail feet, stairs, inside-edge feet), warnings (low ceiling, stair fit, track over a court or zone) and price (surface only; structure / lines quoted separately). | | | `fdm.get_enclosure` | read | One field enclosure by zone: settings, doors, takeoff (perimeter, boards lf, glass and net sq ft, posts, doors) and warnings. | zoneId* | | `fdm.get_layers` | read | Canvas view layers for this page (equipment, flooring, vertical posts, netting, exterior walls, interior walls, ceiling and lights, labels, measurements) with their on / off / mixed state, sub-toggles, and the current camera view. View-only - hiding a layer never removes anything from the design or the quote. | | | `fdm.get_levels` | read | Building levels: which level is being edited (1 = ground, 2 = upper floor / mezzanine plan), the view (l1 / l2 / both), whether Level 2 exists, and a Level 2 summary (deck size, items, zones, equipment lines). | | | `fdm.get_parent_link` | read | Whether this design is linked to a Sports Complex building (opened from Edit / design it on the complex plan). Linked designs send their building size (room width / depth / height) back to the complex plan once saved. Returns the complex design id, building slot and the link back to the complex. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.get_upper_floor` | read | The upper floor / mezzanine: on/off, coverage (mezzanine along one wall or full 2nd floor), wall, depth, length, level-2 height, upstairs clear height, stairs, elevator, finish, use, plus the takeoff (deck and usable sq ft, columns, guardrail, stairs, elevator), warnings (low building, courts under a low deck, track conflict, no elevator / accessibility, single exit) and price (finish only; structure quoted separately). | | | `fdm.list_cages` | read | List netting cages. | | | `fdm.list_designs` | read | The signed-in user's saved designs, newest first. | limit | | `fdm.list_doors` | read | List doors (wall, kind, position along the wall, size). | | | `fdm.list_enclosures` | read | Field enclosures (glass dasher boards / containment netting with doors) on this level, plus which zones can take one. Design elements only - never priced. | | | `fdm.list_equipment` | read | List placed equipment. | | | `fdm.list_interior_walls` | read | List interior walls with their sides (which way each side faces, its finish, and the signageWall key to use for lettering). | | | `fdm.list_layout_recipes` | read | Recipes apply_layout_recipe accepts, plus the layout guide (rules the engine follows). | | | `fdm.list_netting` | read | List all netting: cages (with dividers, baffles, doors, color) and freestanding panels. Remove a panel or cage with remove_object. | | | `fdm.list_posts` | read | List vertical posts / structural columns with their positions and pad config. | | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical and, for gyms, by category home / garage / commercial - the same chips the human sees. | category, vertical | | `fdm.list_products` | read | Search the live catalog this page can design with. kind = floor / equipment / wall-finish / wall-pad / net-system. Returns ids to pass to other verbs. | kind*, query, category, limit | | `fdm.list_pt_clinics` | read | Pre-built PT CLINIC turf designs on Pro Performance 45: Signature Clinic - Logo Centre (Navy turf, White lines, ladders + target ring + hopscotch, logo slot in the centre that the human uploads, edge ticks on the turf designer), plus Florida Blue layouts: agility lane, balance & gait, full rehab suite, pediatric play, return to sport. Each = a set of PT training inlays laid down the zone long axis; recommendedAreaFt is the best-fit turf area. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_pt_inlays` | read | PT / athletic-training turf inlays (cut into the turf, colour configurable): agility ladder (boxes x 1-3 rows), agility dots, numbered markers, numbered hopscotch (classic / pairs / 3x3 grid), star-excursion balance star, four-square grid, clock-face targets, three-direction (Y) reach, zigzag path, figure-eight path, footprint stepping path, measured walking lane, jump-distance lane. Made ONLY on Pro Performance 45 turf. Price: 2500 USD custom charge once per turf zone when any inlay is present, plus a per-piece price (own lines in the quote). Returns the catalog with each type's parameters, the inlay colours, and every turf zone with its inlays. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_racks` | read | Racks and rigs on the floor with their numbered labels (targets for mount_in_rack). | | | `fdm.list_rooms` | read | List enclosed rooms (bathroom / offices / showers / unusable) with their rectangles and any equipment sitting inside them. | | | `fdm.list_signage` | read | List wall lettering / signs. | | | `fdm.list_track_surfaces` | read | Floor products that can be the running surface of the running track (elevated or ground level): Track Flooring OSST (OSSTrax-Elite, 10 colors, pricing pending until its Shopify item is live), Rolled Rubber and Sports Turf from the live catalog, with $/sq ft. | | | `fdm.list_turf_concepts` | read | The 10 Pre-Built Design Concepts for turf zones (end-zone or full-pad inlay graphics with the customer's own two lines of text, auto-scaled to any turf size). Made ONLY on Pro Performance 45 turf. Price: full pad = $7/sq ft on all the zone's turf; end zones = $7/sq ft on the end-zone area only; $3,500 minimum. Also returns the inlay colors and each turf zone's current concept. | | | `fdm.list_upper_floor_finishes` | read | Floor products that can finish level 2 of the upper floor / mezzanine (Rolled Rubber, Sports Turf, Sport Vinyl, Track Flooring from the live catalog) with $/sq ft. | | | `fdm.list_wall_items` | read | List mounted specialty wall panels (band walls, slam walls). | | | `fdm.list_walls` | read | Current wall finishes, wainscot and padding sections. | | | `fdm.list_windows` | read | List windows (wall, kind, position along the wall, size). | | | `fdm.list_zones` | read | List floor zones with products and rectangles. | | | `fdm.mount_in_rack` | mutate | Put a placed barbell in a rack's J-hooks (or take it out). The bar sits across the uprights at squat height and moves with the rack. Racks and bars can be named by their numbered label ("Power Rack 2", "Barbell 1") or placement id - see list_equipment label / list_racks. Visual only; the quote is unchanged. | id*, rack* | | `fdm.move_object` | mutate | Move equipment / cage / zone by id. Equipment and cages: room-centered feet. Zones: room-local NW-origin feet. | id*, position* | | `fdm.open_design` | **high-impact** (confirm:true) | Open one of the saved designs (replaces everything currently on screen - save first if it matters). A design made in a different designer is refused with WRONG_VERTICAL, which names that designer and returns the link to open it there - this page never navigates away mid-call. | id*, confirm | | `fdm.pad_posts` | mutate | Wrap posts in safety padding (sold per vertical foot). Colors: black, navy, royal, forest, maroon, red, gray, purple, sky, tan, kelly, yellow. | posts, color, diameterIn, graphics, heightFt | | `fdm.paint_floor` | mutate | Paint a rectangle of floor squares with a flooring product (or erase paint). Painted squares sit on top of every zone and bill as a second area of that flooring - use it for cut-outs, borders and odd shapes a rectangular zone cannot do. erase:true removes paint in the rect so the zone / primary floor underneath shows again. | product, rect*, erase | | `fdm.place_equipment` | mutate | Place a catalog product (id / Shopify handle / SKU / archetype / name). Omit position and the layout engine finds a free, rule-abiding spot: LIKE KINDS GO IN ROWS (each kind - treadmills, rowers, squat racks, functional trainers - forms its own straight row, extended as you add more; use count:N for one clean row), racks on the north/back wall facing in, dumbbell + kettlebell racks in a linear row on a side wall, cardio rows along the front, clearances kept, nothing on turf. Use nearWall to prefer a wall, inRack:true to put a bench INSIDE the next rack without one. Give position only when the customer named a spot. | product*, position, rotationDeg, count, nearWall, inRack, force | | `fdm.redo` | mutate | Redo the last undone change (same as Ctrl+Y). | | | `fdm.remove_door` | mutate | Remove a door. | id* | | `fdm.remove_elevated_track` | mutate | Turn the running track off, elevated or ground level (its settings are kept if it is turned back on). | | | `fdm.remove_enclosure_door` | mutate | Remove one entry door from a field enclosure. | zoneId*, doorId* | | `fdm.remove_field_enclosure` | mutate | Remove the dasher boards / containment netting from a zone (the zone itself stays). | zoneId* | | `fdm.remove_interior_wall` | mutate | Remove an interior wall (and any signs on it). | id* | | `fdm.remove_net_door` | mutate | Remove a cage entry door by its number (from list_netting). | cageId, number* | | `fdm.remove_object` | mutate | Remove equipment / cage / zone / wall pad section by id. | id* | | `fdm.remove_posts` | mutate | Remove vertical posts (and their padding). posts = all, or a list of numbers / ids. | posts | | `fdm.remove_pt_inlay` | mutate | Remove one PT training inlay (inlayId) or all of them on a zone (all:true). | zoneId*, inlayId, all | | `fdm.remove_room` | mutate | Remove an enclosed room (the floor under it becomes designable again). | id* | | `fdm.remove_signage` | mutate | Remove a sign by id. | id* | | `fdm.remove_upper_floor` | mutate | Turn the upper floor / mezzanine off (settings kept if turned back on). A building height raised automatically for it is restored. | | | `fdm.remove_wall_item` | mutate | Remove a specialty wall panel. | id* | | `fdm.remove_window` | mutate | Remove a window. | id* | | `fdm.rotate_object` | mutate | Rotate equipment / cage by degrees (absolute). | id*, rotationDeg* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save the design to the signed-in account (My Designs). | confirm, name | | `fdm.set_base_floor` | mutate | Set the base flooring that covers everything outside zones. | product* | | `fdm.set_cage` | mutate | Resize or re-spec a cage: size, net weight (36/42/60/72/96), net color (blue, black, green, white), divider count and orientation, front/back baffles. | cageId*, lengthFt, widthFt, heightFt, dividers, dividersRotated, netWeight, color, baffleFront, baffleBack | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D orbit), top (floor plan), walk (eye level), front, back, corner-fl, corner-fr, lookup (ceiling), or iso (reset). View-only. | view* | | `fdm.set_ceiling_lighting` | mutate | Configure the ceiling light systems. Any mix of: downlights (grids of can lights over floor zones), hexGrid (hexagonal LED island), linear (LED strip), wallAccent (wall wash from the ceiling), perimeter (LED strip along the wall/ceiling seam), plus daylight (1 sun .. 0 night), brightness, and visible (show/hide the whole ceiling). Omit a system to leave it alone; {on:false} turns it off. | downlights, hexGrid, linear, wallAccent, perimeter, daylight, brightness, visible | | `fdm.set_elevated_track` | mutate | Add or change the running track around the room. level elevated (default: a wall-attached mezzanine with support columns to the floor) or ground (the same loop laid on the slab: surface + lane lines + inside-edge transition, no deck / columns / rail / stairs; heightFt, postSpacingFt, railing and stairs are ignored; floor zones must sit inside the loop). Any field is optional; enabled:true turns it on. widthFt 6-20, heightFt 10-20 (default 15), postSpacingFt 10-30 (default 25), cornerRadiusFt 0-40 (default 12: inside corners are rounded where two sides meet, lane lines and rail run as one continuous loop; clamped to fit the room), walls = which walls it runs along (north/east/south/west; all four = full loop), surfaceFloorId from list_track_surfaces, stairs 0-4, firstStairWall. The room needs a ceiling of heightFt + 8 ft; pass raiseCeiling:true to raise it automatically. Rectangular rooms only. | enabled, level, widthFt, heightFt, postSpacingFt, cornerRadiusFt, walls, surfaceFloorId, railing, laneLines, stairs, firstStairWall, raiseCeiling | | `fdm.set_field_enclosure` | mutate | Wrap a turf field / floor zone with glass dasher boards (soccer, lacrosse, hockey), containment netting on posts with optional top netting, or both; add entry doors in the boards. Creates the enclosure on first call; later calls change any field. Non-saleable design elements: never priced or added to the cart, listed on the PDF for the building team. | zoneId*, kind, boardHeightFt, glassHeightFt, netHeightFt, topNet, netColor, postSpacingFt, insetFt, doors | | `fdm.set_gym_type` | mutate | Switch the facility type: commercial (18 ft ceiling default) or home / garage gym (10 ft ceiling, ceiling fixtures hidden). Same defaults the Room panel applies. | type* | | `fdm.set_layer` | read | Show or hide a canvas view layer, or one of its sub-toggles (e.g. layer labels, toggle equipment_labels). Layer ids come from get_layers. Optional netColor blue / black previews the netting color. View-only. | layer*, on, toggle, netColor | | `fdm.set_level` | mutate | Switch the building level being edited. view l1 = ground floor (default), l2 = the upper floor / mezzanine plan (all floor, equipment, padding and signage verbs then act on level 2, kept inside the deck), both = level 1 editable with level 2 shown on the deck. Needs an upper floor (set_upper_floor). | view* | | `fdm.set_placement_variant` | mutate | Switch a placed product between its display variants (visual only - same product, SKU and price in the quote). Today: barbells with a "loaded" variant show the bar WITH bumper plates on it. list_equipment / list_products show variants[] on records that have any; pass variant "none" to go back to the plain product. | id*, variant* | | `fdm.set_pt_inlay` | mutate | Change a PT training inlay: params, colours, rotation (0/90/180/270) or position (offsetFt from the zone centre). | zoneId*, inlayId*, params, lineColor, numberColor, rotDeg, offsetFt | | `fdm.set_room` | mutate | Set the building size (interior feet). Zones and equipment that no longer fit are pulled back inside. | widthFt, depthFt, heightFt, name | | `fdm.set_upper_floor` | mutate | Add or change the upper floor. coverage mezzanine (a deck along one wall: depthFt 10-150, spanPct 20-100 of that wall, centred) or full (whole footprint). wall north/east/south/west = the mezzanine wall and where stairs + elevator sit. levelFt 9-32 = level-2 floor height, upperClearFt 8-24 = upstairs ceiling; with autoCeiling (default on) the building height rises to levelFt + upperClearFt and is restored when the floor is removed. stairs 1-3 switchback stairs, elevator (accessible, default on), railing, surfaceFloorId from list_upper_floor_finishes ("" = none), use multi/fitness/offices/viewing/party/storage, show (3D visibility, view only). Rectangular buildings only. | enabled, coverage, wall, depthFt, spanPct, levelFt, upperClearFt, autoCeiling, columnSpacingFt, stairs, elevator, railing, surfaceFloorId, use, show | | `fdm.set_wainscot` | mutate | Apply a wainscot (lower band) finish to a wall or all walls. | wall, finish* | | `fdm.set_wall_design` | mutate | Put a full-wall painted mural design on a wall: brushgrit (Brush + Text), peak (Mountain Peak), hexpower (Hexagons), geometric, arrows (Chevrons), heartbeat, topo (Topographic), splatter (Impact Splatter). Colorways: red, yellow (gold), orange, green, blue, cyan (ice), purple, sage, mono. brushgrit and peak take a headline text. Use set_wall_paint to go back to plain paint. | wall, walls, design*, colorway, headline | | `fdm.set_wall_paint` | mutate | Paint / finish a wall (or all walls). finish = color name, finish id, or hex (#2a2a2a → nearest paint). | wall, finish*, walls | | `fdm.set_zone_markings` | mutate | Turf-lane markings: yard lines every 5 yards, hash marks every yard, and painted floor text along the lane (e.g. a brand name in white). Lines are white. Works on turf-lane zones from add_floor_zone / list_zones whose turf product is custom-eligible (CUSTOMTURF_Yes); stock turf returns NOT_AVAILABLE - pick a custom-eligible turf via list_products kind=floor first. | zoneId*, yardLines, hashMarks, text, textColor, textHeightFt | | `fdm.set_zone_product` | mutate | Change the flooring product of a zone. | zoneId*, product* | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: submit the current design + material list for a custom quotation (saves the design, generates the PDF, emails the quote team). Requires a signed-in user and confirm:true. | confirm, note | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.update_door` | mutate | Move a door along or to another wall, change its kind, opening height (overhead/garage) or garage width. | id*, wall, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.update_enclosure_door` | mutate | Move or re-spec an enclosure door (side, alongFt, widthFt, kind). | zoneId*, doorId*, side, alongFt, widthFt, kind | | `fdm.update_interior_wall` | mutate | Move, resize, rotate (orientation), repaint or hide an interior wall. | id*, enabled, orientation, center, lengthFt, heightFt, finish, finishSide1, finishSide2 | | `fdm.update_net_panel` | mutate | Move, resize, rotate, re-spec or add/remove the door on a netting panel. | id*, widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.update_room` | mutate | Move, resize, relabel, rotate or change the variant of an enclosed room. | id*, kind, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.update_signage` | mutate | Change a sign: text, color, backlight, letter height, position, wall (exterior or interior wall side). | id*, interiorWall, side, text, color, backlight, letterHeightFt, wall, position | | `fdm.update_wall_item` | mutate | Move or resize a specialty wall panel, or move it to another wall. | id*, wall, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.update_wall_padding` | mutate | Change one wall padding section: color, height, run length, position along the wall, or height off the floor. Remove with remove_object. | id*, color, heightFt, lengthFt, offsetFt, fromFloorFt | | `fdm.update_window` | mutate | Move a window along or to another wall, or change its kind. | id*, wall, kind, position, alongFt | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Indoor Court Designer (`indoor-courts`) URL: `/indoor-courts/` — manifest: `/indoor-courts/capabilities.json` — 127 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.add_cage` | mutate | Add batting/practice netting cages. Sizes in feet (lengthFt = hitting direction, widthFt = one lane). lanes > 1 builds ONE shell of that many side-by-side lanes (width = lanes x widthFt) with sliding dividers - the normal way to do "6 cages 70 x 15". count > 1 builds separate cages side by side. Orientation is picked automatically so the footprint fits the building; an orientation or wall that cannot fit is corrected and reported in adjusted. Hitting mats auto-place (one per lane) - never add them separately. | lengthFt, widthFt, lanes, heightFt, count, alongWall, position, rotationDeg, netWeight | | `fdm.add_court` | mutate | Add a court of the current mode sport (or a given sport) using a preset (e.g. high-school, ncaa, junior, fivb-women, standard). The building grows if needed. | sport, preset, label, surroundFt | | `fdm.add_door` | mutate | Add a door on an exterior wall (max 3). Kinds: single-glass, single-wood, double-glass (default), overhead (commercial roll-up), garage (residential sectional). Place with position 0..1 or alongFt. | wall*, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.add_enclosure_door` | mutate | Add an entry door to a field enclosure: side, position along that side (door centre in feet), width / kind (player 4 ft, double 8 ft, gate 12 ft). Rendered as a framed door leaf in the boards (or a zip door in a net-only enclosure). | zoneId*, side*, alongFt*, widthFt, kind | | `fdm.add_floor_zone` | mutate | Add a floor zone (turf strip, rubber area, fitness area, court surface, etc.). Give a product (floor id / Shopify handle / name) and either a rect or a wall to run along. kind fitness = rubber-floored gym area: strength and cardio equipment is PLACED THERE BY DEFAULT (product optional - defaults to rubber). | product, kind, label, rect, alongWall, lengthFt, widthFt, replace | | `fdm.add_interior_wall` | mutate | Add a freestanding interior wall inside the room (partial or full height - half walls, dividers, a wall to hang signage on). Up to 3, 6 in thick. Give the center, orientation, length and height; paint each side; put lettering on a side with add_signage using interiorWall + side. | orientation, center*, lengthFt*, heightFt, finish, finishSide1, finishSide2 | | `fdm.add_net_door` | mutate | Add a zip-up entry door (yellow outline) to a netting cage. Pick the side and location on that side; with dividers, lane = which sub-cage (1 = leftmost). | cageId, side, location, slot, lane | | `fdm.add_net_panel` | mutate | Add a freestanding netting panel / divider curtain (a flat wall of net, hung from the ceiling structure). Use it to split areas, back a driving range line, or protect walls. Position is the panel center, room-centered feet; rotation 0 = the panel runs east-west. | widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.add_overlay` | mutate | Stripe a second sport's lines on a court (e.g. volleyball on basketball, pickleball on either). Volleyball / pickleball overlays bring a net. | courtId, sport*, lineColor | | `fdm.add_post_grid` | mutate | Generate an evenly spaced grid of vertical support posts (building columns). Existing posts are re-seated onto the new grid so their pads survive; surplus posts are removed. Posts block nothing by themselves but can be padded (pad_posts). | cols*, rows*, spacingXFt, spacingZFt, shape, sizeIn, offsetXFt, offsetZFt | | `fdm.add_pride_walls` | mutate | Add 20 ft x 6 ft padded pride-wall sections on both long-side exterior walls of a court. | courtId | | `fdm.add_pt_inlay` | mutate | Add a PT training inlay to a turf zone (types / params from list_pt_inlays). Placed at the zone centre (offsetFt moves it; +x right, +z toward the front wall), long axis along the zone's long axis unless rotDeg is given. Colours by name or hex from list_pt_inlays. Zone must be Pro Performance 45 - pass switchToPP45:true to switch it first. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, type*, params, lineColor, numberColor, rotDeg, offsetFt, switchToPP45 | | `fdm.add_room` | mutate | Add an enclosed room - bathroom, offices, showers or unusable space (dock). It is a non-billable locked area: flooring is excluded, equipment cannot sit on it, walls behind it are locked. Place it in a corner or against a wall. Returns equipmentInside so you can move anything already there. | kind*, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.add_signage` | mutate | Put lettering on a wall: aluminum letters (optionally with a colored backlight halo / glow behind them), painted letters (any paint color, e.g. neon green) or neon tube letters (neon colors). Walls: north = Wall 1 (back), east = Wall 2 (right), south = Wall 3 (front), west = Wall 4 (left). Centered on the wall unless a position is given. | wall, interiorWall, side, text*, material*, color, backlight, letterHeightFt, position | | `fdm.add_wall_item` | mutate | Mount a specialty wall panel on an exterior wall: band-wall (resistance band anchor wall) or slam-wall (slam / med ball wall). 10x10 ft max, 3 in thick. | kind*, wall*, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.add_wall_padding` | mutate | Add wall padding sections to a wall: height in feet, optional run length (default = full wall), color from the live pad catalog. | wall*, heightFt, lengthFt, offsetFt, fromFloorFt, color | | `fdm.add_window` | mutate | Add a window on an exterior wall (max 3). Every window shows a landscape backdrop from inside. | wall*, kind, position, alongFt | | `fdm.apply_court_layout` | mutate | Replace the courts with a multi-court facility layout: count and columns (or a layout id from get_court_mode). Sizes the building automatically. | layoutId, count, cols, preset, aisleFt | | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.apply_layout_recipe` | **high-impact** (confirm:true) | HIGH IMPACT: replace all equipment with a complete recipe layout sized to the room (e.g. commercial-gym). Uses a saved template for this room size when one exists. | recipe, confirm | | `fdm.apply_pt_clinic` | mutate | Apply a pre-built PT clinic design to a turf zone: switches it to Pro Performance 45 (Florida Blue unless keepTurfColor) and REPLACES its PT inlays with the clinic pieces (editable afterwards with set_pt_inlay). fits:false means the zone is smaller than the layout. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, clinicId*, lineColor, numberColor, keepTurfColor | | `fdm.apply_turf_concept` | mutate | Put a Pre-Built Design Concept on a turf zone (list_turf_concepts). kind ez = art in both end zones (yard lines / hash marks stay separate add-ons via set_zone_markings), full = one graphic over the whole zone. line1 up to 12 letters, line2 up to 16. Colors by name or hex from list_turf_concepts colors. Zone must be Pro Performance 45 - pass switchToPP45:true to switch the zone's turf (same color when available). | zoneId*, design, kind, line1, line2, accentColor, textColor, switchToPP45 | | `fdm.arrange_equipment` | mutate | Re-lay the equipment already on the floor by the commercial-gym rules (racks along the north wall facing in, one bench inside each rack, plate-loaded and selectorized rows, dumbbell/kettlebell racks in a linear row, cardio along the front, clearances and aisles kept, nothing on turf). Columns and wall-mounted items stay. Undoable. | ids, nearWall | | `fdm.classify_commercial_path` | read | Decide whether this design is a simple purchase or needs a custom quotation, with reasons (policy §3A). | | | `fdm.clear_design` | **high-impact** (confirm:true) | Remove everything but the building: equipment, cages and net panels, floor zones and enclosed rooms, wall padding, signage and wall items, doors, windows, interior walls, field enclosures, the running track and the upper floor (room size kept; the base floor stays). | confirm | | `fdm.clear_turf_concept` | mutate | Remove the Pre-Built Design Concept from a turf zone (field lines stay). | zoneId* | | `fdm.create_purchase_link` | **high-impact** (confirm:true) | HIGH IMPACT: for a purchase-path design, build the checkout handoff. Returns the material list; on this page the human completes checkout on kodiaksports.com. | confirm | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Open the PDF export. Landscape document in this order: quote page (facility, spec, estimated total, clickable contents), bill of materials grouped by family with flooring installation details, equipment summary with photos, then the 3D views. The human confirms the download. | | | `fdm.fit_building` | mutate | Shrink-wrap / grow the building around the courts (plus bleachers) with a margin. | marginFt | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_ceiling` | read | Read the ceiling lighting setup (downlights, hex island, linear, wall accent, perimeter, daylight). | | | `fdm.get_court_mode` | read | Current designer mode (basketball / volleyball / pickleball / combo / fieldhouse) and the presets / layouts each sport offers. fieldhouse = mixed multi-sport building (fieldHousePlan shows the starter program). | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_elevated_track` | read | The running track: on/off, level (elevated mezzanine or ground level on the slab), width, height, walls, column spacing, surface, rail, lanes, stairs, plus the takeoff (surface sq ft, lap length and laps per mile, lanes, columns, guardrail feet, stairs, inside-edge feet), warnings (low ceiling, stair fit, track over a court or zone) and price (surface only; structure / lines quoted separately). | | | `fdm.get_enclosure` | read | One field enclosure by zone: settings, doors, takeoff (perimeter, boards lf, glass and net sq ft, posts, doors) and warnings. | zoneId* | | `fdm.get_layers` | read | Canvas view layers for this page (equipment, flooring, vertical posts, netting, exterior walls, interior walls, ceiling and lights, labels, measurements) with their on / off / mixed state, sub-toggles, and the current camera view. View-only - hiding a layer never removes anything from the design or the quote. | | | `fdm.get_levels` | read | Building levels: which level is being edited (1 = ground, 2 = upper floor / mezzanine plan), the view (l1 / l2 / both), whether Level 2 exists, and a Level 2 summary (deck size, items, zones, equipment lines). | | | `fdm.get_parent_link` | read | Whether this design is linked to a Sports Complex building (opened from Edit / design it on the complex plan). Linked designs send their building size (room width / depth / height) back to the complex plan once saved. Returns the complex design id, building slot and the link back to the complex. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.get_upper_floor` | read | The upper floor / mezzanine: on/off, coverage (mezzanine along one wall or full 2nd floor), wall, depth, length, level-2 height, upstairs clear height, stairs, elevator, finish, use, plus the takeoff (deck and usable sq ft, columns, guardrail, stairs, elevator), warnings (low building, courts under a low deck, track conflict, no elevator / accessibility, single exit) and price (finish only; structure quoted separately). | | | `fdm.list_cages` | read | List netting cages. | | | `fdm.list_courts` | read | List courts with sport, preset, size, overlays, goals, bleachers and net. | | | `fdm.list_designs` | read | The signed-in user's saved designs, newest first. | limit | | `fdm.list_doors` | read | List doors (wall, kind, position along the wall, size). | | | `fdm.list_enclosures` | read | Field enclosures (glass dasher boards / containment netting with doors) on this level, plus which zones can take one. Design elements only - never priced. | | | `fdm.list_equipment` | read | List placed equipment. | | | `fdm.list_interior_walls` | read | List interior walls with their sides (which way each side faces, its finish, and the signageWall key to use for lettering). | | | `fdm.list_layout_recipes` | read | Recipes apply_layout_recipe accepts, plus the layout guide (rules the engine follows). | | | `fdm.list_netting` | read | List all netting: cages (with dividers, baffles, doors, color) and freestanding panels. Remove a panel or cage with remove_object. | | | `fdm.list_posts` | read | List vertical posts / structural columns with their positions and pad config. | | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical and, for gyms, by category home / garage / commercial - the same chips the human sees. | category, vertical | | `fdm.list_products` | read | Search the live catalog this page can design with. kind = floor / equipment / wall-finish / wall-pad / net-system. Returns ids to pass to other verbs. | kind*, query, category, limit | | `fdm.list_pt_clinics` | read | Pre-built PT CLINIC turf designs on Pro Performance 45: Signature Clinic - Logo Centre (Navy turf, White lines, ladders + target ring + hopscotch, logo slot in the centre that the human uploads, edge ticks on the turf designer), plus Florida Blue layouts: agility lane, balance & gait, full rehab suite, pediatric play, return to sport. Each = a set of PT training inlays laid down the zone long axis; recommendedAreaFt is the best-fit turf area. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_pt_inlays` | read | PT / athletic-training turf inlays (cut into the turf, colour configurable): agility ladder (boxes x 1-3 rows), agility dots, numbered markers, numbered hopscotch (classic / pairs / 3x3 grid), star-excursion balance star, four-square grid, clock-face targets, three-direction (Y) reach, zigzag path, figure-eight path, footprint stepping path, measured walking lane, jump-distance lane. Made ONLY on Pro Performance 45 turf. Price: 2500 USD custom charge once per turf zone when any inlay is present, plus a per-piece price (own lines in the quote). Returns the catalog with each type's parameters, the inlay colours, and every turf zone with its inlays. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_racks` | read | Racks and rigs on the floor with their numbered labels (targets for mount_in_rack). | | | `fdm.list_rooms` | read | List enclosed rooms (bathroom / offices / showers / unusable) with their rectangles and any equipment sitting inside them. | | | `fdm.list_signage` | read | List wall lettering / signs. | | | `fdm.list_track_surfaces` | read | Floor products that can be the running surface of the running track (elevated or ground level): Track Flooring OSST (OSSTrax-Elite, 10 colors, pricing pending until its Shopify item is live), Rolled Rubber and Sports Turf from the live catalog, with $/sq ft. | | | `fdm.list_turf_concepts` | read | The 10 Pre-Built Design Concepts for turf zones (end-zone or full-pad inlay graphics with the customer's own two lines of text, auto-scaled to any turf size). Made ONLY on Pro Performance 45 turf. Price: full pad = $7/sq ft on all the zone's turf; end zones = $7/sq ft on the end-zone area only; $3,500 minimum. Also returns the inlay colors and each turf zone's current concept. | | | `fdm.list_upper_floor_finishes` | read | Floor products that can finish level 2 of the upper floor / mezzanine (Rolled Rubber, Sports Turf, Sport Vinyl, Track Flooring from the live catalog) with $/sq ft. | | | `fdm.list_wall_items` | read | List mounted specialty wall panels (band walls, slam walls). | | | `fdm.list_walls` | read | Current wall finishes, wainscot and padding sections. | | | `fdm.list_windows` | read | List windows (wall, kind, position along the wall, size). | | | `fdm.list_zones` | read | List floor zones with products and rectangles. | | | `fdm.mount_in_rack` | mutate | Put a placed barbell in a rack's J-hooks (or take it out). The bar sits across the uprights at squat height and moves with the rack. Racks and bars can be named by their numbered label ("Power Rack 2", "Barbell 1") or placement id - see list_equipment label / list_racks. Visual only; the quote is unchanged. | id*, rack* | | `fdm.move_object` | mutate | Move equipment / cage / zone by id. Equipment and cages: room-centered feet. Zones: room-local NW-origin feet. | id*, position* | | `fdm.open_design` | **high-impact** (confirm:true) | Open one of the saved designs (replaces everything currently on screen - save first if it matters). A design made in a different designer is refused with WRONG_VERTICAL, which names that designer and returns the link to open it there - this page never navigates away mid-call. | id*, confirm | | `fdm.pad_posts` | mutate | Wrap posts in safety padding (sold per vertical foot). Colors: black, navy, royal, forest, maroon, red, gray, purple, sky, tan, kelly, yellow. | posts, color, diameterIn, graphics, heightFt | | `fdm.paint_floor` | mutate | Paint a rectangle of floor squares with a flooring product (or erase paint). Painted squares sit on top of every zone and bill as a second area of that flooring - use it for cut-outs, borders and odd shapes a rectangular zone cannot do. erase:true removes paint in the rect so the zone / primary floor underneath shows again. | product, rect*, erase | | `fdm.place_equipment` | mutate | Place a catalog product (id / Shopify handle / SKU / archetype / name). Omit position and the layout engine finds a free, rule-abiding spot: LIKE KINDS GO IN ROWS (each kind - treadmills, rowers, squat racks, functional trainers - forms its own straight row, extended as you add more; use count:N for one clean row), racks on the north/back wall facing in, dumbbell + kettlebell racks in a linear row on a side wall, cardio rows along the front, clearances kept, nothing on turf. Use nearWall to prefer a wall, inRack:true to put a bench INSIDE the next rack without one. Give position only when the customer named a spot. | product*, position, rotationDeg, count, nearWall, inRack, force | | `fdm.redo` | mutate | Redo the last undone change (same as Ctrl+Y). | | | `fdm.remove_door` | mutate | Remove a door. | id* | | `fdm.remove_elevated_track` | mutate | Turn the running track off, elevated or ground level (its settings are kept if it is turned back on). | | | `fdm.remove_enclosure_door` | mutate | Remove one entry door from a field enclosure. | zoneId*, doorId* | | `fdm.remove_field_enclosure` | mutate | Remove the dasher boards / containment netting from a zone (the zone itself stays). | zoneId* | | `fdm.remove_interior_wall` | mutate | Remove an interior wall (and any signs on it). | id* | | `fdm.remove_net_door` | mutate | Remove a cage entry door by its number (from list_netting). | cageId, number* | | `fdm.remove_object` | mutate | Remove equipment / cage / zone / wall pad section by id. | id* | | `fdm.remove_posts` | mutate | Remove vertical posts (and their padding). posts = all, or a list of numbers / ids. | posts | | `fdm.remove_pt_inlay` | mutate | Remove one PT training inlay (inlayId) or all of them on a zone (all:true). | zoneId*, inlayId, all | | `fdm.remove_room` | mutate | Remove an enclosed room (the floor under it becomes designable again). | id* | | `fdm.remove_signage` | mutate | Remove a sign by id. | id* | | `fdm.remove_upper_floor` | mutate | Turn the upper floor / mezzanine off (settings kept if turned back on). A building height raised automatically for it is restored. | | | `fdm.remove_wall_item` | mutate | Remove a specialty wall panel. | id* | | `fdm.remove_window` | mutate | Remove a window. | id* | | `fdm.rotate_object` | mutate | Rotate equipment / cage by degrees (absolute). | id*, rotationDeg* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save the design to the signed-in account (My Designs). | confirm, name | | `fdm.set_base_floor` | mutate | Set the base flooring that covers everything outside zones. | product* | | `fdm.set_bleachers` | mutate | Toggle bleachers on both long sides of a basketball court (5-25 rows); the building grows to fit. | courtId, enabled, rows | | `fdm.set_cage` | mutate | Resize or re-spec a cage: size, net weight (36/42/60/72/96), net color (blue, black, green, white), divider count and orientation, front/back baffles. | cageId*, lengthFt, widthFt, heightFt, dividers, dividersRotated, netWeight, color, baffleFront, baffleBack | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D orbit), top (floor plan), walk (eye level), front, back, corner-fl, corner-fr, lookup (ceiling), or iso (reset). View-only. | view* | | `fdm.set_ceiling_lighting` | mutate | Configure the ceiling light systems. Any mix of: downlights (grids of can lights over floor zones), hexGrid (hexagonal LED island), linear (LED strip), wallAccent (wall wash from the ceiling), perimeter (LED strip along the wall/ceiling seam), plus daylight (1 sun .. 0 night), brightness, and visible (show/hide the whole ceiling). Omit a system to leave it alone; {on:false} turns it off. | downlights, hexGrid, linear, wallAccent, perimeter, daylight, brightness, visible | | `fdm.set_court_mode` | mutate | Switch the designer mode. combo = high-school basketball court with volleyball lines in a second color and the net on the half-court line. fieldhouse = Field House: mixed basketball / volleyball / pickleball courts in one building + Fitness Area + turf lane + elevated track; existing courts are KEPT as-is and add_court takes any sport. Other modes convert existing courts in place. A fresh design (or reseed:true) is re-seeded. | mode*, reseed, noSeed, program | | `fdm.set_court_preset` | mutate | Change a court's size preset (e.g. high-school → ncaa) and refit the zone. | courtId, preset* | | `fdm.set_elevated_track` | mutate | Add or change the running track around the room. level elevated (default: a wall-attached mezzanine with support columns to the floor) or ground (the same loop laid on the slab: surface + lane lines + inside-edge transition, no deck / columns / rail / stairs; heightFt, postSpacingFt, railing and stairs are ignored; floor zones must sit inside the loop). Any field is optional; enabled:true turns it on. widthFt 6-20, heightFt 10-20 (default 15), postSpacingFt 10-30 (default 25), cornerRadiusFt 0-40 (default 12: inside corners are rounded where two sides meet, lane lines and rail run as one continuous loop; clamped to fit the room), walls = which walls it runs along (north/east/south/west; all four = full loop), surfaceFloorId from list_track_surfaces, stairs 0-4, firstStairWall. The room needs a ceiling of heightFt + 8 ft; pass raiseCeiling:true to raise it automatically. Rectangular rooms only. | enabled, level, widthFt, heightFt, postSpacingFt, cornerRadiusFt, walls, surfaceFloorId, railing, laneLines, stairs, firstStairWall, raiseCeiling | | `fdm.set_field_enclosure` | mutate | Wrap a turf field / floor zone with glass dasher boards (soccer, lacrosse, hockey), containment netting on posts with optional top netting, or both; add entry doors in the boards. Creates the enclosure on first call; later calls change any field. Non-saleable design elements: never priced or added to the cart, listed on the PDF for the building team. | zoneId*, kind, boardHeightFt, glassHeightFt, netHeightFt, topNet, netColor, postSpacingFt, insetFt, doors | | `fdm.set_goals` | mutate | Basketball goal style (ceiling / wall / floor) and rim height. | courtId, style, rimFt, enabled | | `fdm.set_gym_type` | mutate | Switch the facility type: commercial (18 ft ceiling default) or home / garage gym (10 ft ceiling, ceiling fixtures hidden). Same defaults the Room panel applies. | type* | | `fdm.set_layer` | read | Show or hide a canvas view layer, or one of its sub-toggles (e.g. layer labels, toggle equipment_labels). Layer ids come from get_layers. Optional netColor blue / black previews the netting color. View-only. | layer*, on, toggle, netColor | | `fdm.set_level` | mutate | Switch the building level being edited. view l1 = ground floor (default), l2 = the upper floor / mezzanine plan (all floor, equipment, padding and signage verbs then act on level 2, kept inside the deck), both = level 1 editable with level 2 shown on the deck. Needs an upper floor (set_upper_floor). | view* | | `fdm.set_net` | mutate | Volleyball / pickleball net on a court: on/off, height (ft), referee stand, antennae. | courtId, enabled, heightFt, refStand, antennae | | `fdm.set_net_product` | mutate | Choose the volleyball net system product for a court from the live catalog (list_products kind=net-system); prices the net line and sets in-ground vs portable rendering. null clears it. | courtId, product | | `fdm.set_placement_variant` | mutate | Switch a placed product between its display variants (visual only - same product, SKU and price in the quote). Today: barbells with a "loaded" variant show the bar WITH bumper plates on it. list_equipment / list_products show variants[] on records that have any; pass variant "none" to go back to the plain product. | id*, variant* | | `fdm.set_pt_inlay` | mutate | Change a PT training inlay: params, colours, rotation (0/90/180/270) or position (offsetFt from the zone centre). | zoneId*, inlayId*, params, lineColor, numberColor, rotDeg, offsetFt | | `fdm.set_room` | mutate | Set the building size (interior feet). Zones and equipment that no longer fit are pulled back inside. | widthFt, depthFt, heightFt, name | | `fdm.set_upper_floor` | mutate | Add or change the upper floor. coverage mezzanine (a deck along one wall: depthFt 10-150, spanPct 20-100 of that wall, centred) or full (whole footprint). wall north/east/south/west = the mezzanine wall and where stairs + elevator sit. levelFt 9-32 = level-2 floor height, upperClearFt 8-24 = upstairs ceiling; with autoCeiling (default on) the building height rises to levelFt + upperClearFt and is restored when the floor is removed. stairs 1-3 switchback stairs, elevator (accessible, default on), railing, surfaceFloorId from list_upper_floor_finishes ("" = none), use multi/fitness/offices/viewing/party/storage, show (3D visibility, view only). Rectangular buildings only. | enabled, coverage, wall, depthFt, spanPct, levelFt, upperClearFt, autoCeiling, columnSpacingFt, stairs, elevator, railing, surfaceFloorId, use, show | | `fdm.set_wainscot` | mutate | Apply a wainscot (lower band) finish to a wall or all walls. | wall, finish* | | `fdm.set_wall_design` | mutate | Put a full-wall painted mural design on a wall: brushgrit (Brush + Text), peak (Mountain Peak), hexpower (Hexagons), geometric, arrows (Chevrons), heartbeat, topo (Topographic), splatter (Impact Splatter). Colorways: red, yellow (gold), orange, green, blue, cyan (ice), purple, sage, mono. brushgrit and peak take a headline text. Use set_wall_paint to go back to plain paint. | wall, walls, design*, colorway, headline | | `fdm.set_wall_paint` | mutate | Paint / finish a wall (or all walls). finish = color name, finish id, or hex (#2a2a2a → nearest paint). | wall, finish*, walls | | `fdm.set_zone_markings` | mutate | Turf-lane markings: yard lines every 5 yards, hash marks every yard, and painted floor text along the lane (e.g. a brand name in white). Lines are white. Works on turf-lane zones from add_floor_zone / list_zones whose turf product is custom-eligible (CUSTOMTURF_Yes); stock turf returns NOT_AVAILABLE - pick a custom-eligible turf via list_products kind=floor first. | zoneId*, yardLines, hashMarks, text, textColor, textHeightFt | | `fdm.set_zone_product` | mutate | Change the flooring product of a zone. | zoneId*, product* | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: submit the current design + material list for a custom quotation (saves the design, generates the PDF, emails the quote team). Requires a signed-in user and confirm:true. | confirm, note | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.update_door` | mutate | Move a door along or to another wall, change its kind, opening height (overhead/garage) or garage width. | id*, wall, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.update_enclosure_door` | mutate | Move or re-spec an enclosure door (side, alongFt, widthFt, kind). | zoneId*, doorId*, side, alongFt, widthFt, kind | | `fdm.update_interior_wall` | mutate | Move, resize, rotate (orientation), repaint or hide an interior wall. | id*, enabled, orientation, center, lengthFt, heightFt, finish, finishSide1, finishSide2 | | `fdm.update_net_panel` | mutate | Move, resize, rotate, re-spec or add/remove the door on a netting panel. | id*, widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.update_room` | mutate | Move, resize, relabel, rotate or change the variant of an enclosed room. | id*, kind, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.update_signage` | mutate | Change a sign: text, color, backlight, letter height, position, wall (exterior or interior wall side). | id*, interiorWall, side, text, color, backlight, letterHeightFt, wall, position | | `fdm.update_wall_item` | mutate | Move or resize a specialty wall panel, or move it to another wall. | id*, wall, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.update_wall_padding` | mutate | Change one wall padding section: color, height, run length, position along the wall, or height off the floor. Remove with remove_object. | id*, color, heightFt, lengthFt, offsetFt, fromFloorFt | | `fdm.update_window` | mutate | Move a window along or to another wall, or change its kind. | id*, wall, kind, position, alongFt | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Field House Designer (`field-house`) URL: `/field-house/` — manifest: `/field-house/capabilities.json` — 127 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.add_cage` | mutate | Add batting/practice netting cages. Sizes in feet (lengthFt = hitting direction, widthFt = one lane). lanes > 1 builds ONE shell of that many side-by-side lanes (width = lanes x widthFt) with sliding dividers - the normal way to do "6 cages 70 x 15". count > 1 builds separate cages side by side. Orientation is picked automatically so the footprint fits the building; an orientation or wall that cannot fit is corrected and reported in adjusted. Hitting mats auto-place (one per lane) - never add them separately. | lengthFt, widthFt, lanes, heightFt, count, alongWall, position, rotationDeg, netWeight | | `fdm.add_court` | mutate | Add a court of the current mode sport (or a given sport) using a preset (e.g. high-school, ncaa, junior, fivb-women, standard). The building grows if needed. | sport, preset, label, surroundFt | | `fdm.add_door` | mutate | Add a door on an exterior wall (max 3). Kinds: single-glass, single-wood, double-glass (default), overhead (commercial roll-up), garage (residential sectional). Place with position 0..1 or alongFt. | wall*, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.add_enclosure_door` | mutate | Add an entry door to a field enclosure: side, position along that side (door centre in feet), width / kind (player 4 ft, double 8 ft, gate 12 ft). Rendered as a framed door leaf in the boards (or a zip door in a net-only enclosure). | zoneId*, side*, alongFt*, widthFt, kind | | `fdm.add_floor_zone` | mutate | Add a floor zone (turf strip, rubber area, fitness area, court surface, etc.). Give a product (floor id / Shopify handle / name) and either a rect or a wall to run along. kind fitness = rubber-floored gym area: strength and cardio equipment is PLACED THERE BY DEFAULT (product optional - defaults to rubber). | product, kind, label, rect, alongWall, lengthFt, widthFt, replace | | `fdm.add_interior_wall` | mutate | Add a freestanding interior wall inside the room (partial or full height - half walls, dividers, a wall to hang signage on). Up to 3, 6 in thick. Give the center, orientation, length and height; paint each side; put lettering on a side with add_signage using interiorWall + side. | orientation, center*, lengthFt*, heightFt, finish, finishSide1, finishSide2 | | `fdm.add_net_door` | mutate | Add a zip-up entry door (yellow outline) to a netting cage. Pick the side and location on that side; with dividers, lane = which sub-cage (1 = leftmost). | cageId, side, location, slot, lane | | `fdm.add_net_panel` | mutate | Add a freestanding netting panel / divider curtain (a flat wall of net, hung from the ceiling structure). Use it to split areas, back a driving range line, or protect walls. Position is the panel center, room-centered feet; rotation 0 = the panel runs east-west. | widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.add_overlay` | mutate | Stripe a second sport's lines on a court (e.g. volleyball on basketball, pickleball on either). Volleyball / pickleball overlays bring a net. | courtId, sport*, lineColor | | `fdm.add_post_grid` | mutate | Generate an evenly spaced grid of vertical support posts (building columns). Existing posts are re-seated onto the new grid so their pads survive; surplus posts are removed. Posts block nothing by themselves but can be padded (pad_posts). | cols*, rows*, spacingXFt, spacingZFt, shape, sizeIn, offsetXFt, offsetZFt | | `fdm.add_pride_walls` | mutate | Add 20 ft x 6 ft padded pride-wall sections on both long-side exterior walls of a court. | courtId | | `fdm.add_pt_inlay` | mutate | Add a PT training inlay to a turf zone (types / params from list_pt_inlays). Placed at the zone centre (offsetFt moves it; +x right, +z toward the front wall), long axis along the zone's long axis unless rotDeg is given. Colours by name or hex from list_pt_inlays. Zone must be Pro Performance 45 - pass switchToPP45:true to switch it first. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, type*, params, lineColor, numberColor, rotDeg, offsetFt, switchToPP45 | | `fdm.add_room` | mutate | Add an enclosed room - bathroom, offices, showers or unusable space (dock). It is a non-billable locked area: flooring is excluded, equipment cannot sit on it, walls behind it are locked. Place it in a corner or against a wall. Returns equipmentInside so you can move anything already there. | kind*, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.add_signage` | mutate | Put lettering on a wall: aluminum letters (optionally with a colored backlight halo / glow behind them), painted letters (any paint color, e.g. neon green) or neon tube letters (neon colors). Walls: north = Wall 1 (back), east = Wall 2 (right), south = Wall 3 (front), west = Wall 4 (left). Centered on the wall unless a position is given. | wall, interiorWall, side, text*, material*, color, backlight, letterHeightFt, position | | `fdm.add_wall_item` | mutate | Mount a specialty wall panel on an exterior wall: band-wall (resistance band anchor wall) or slam-wall (slam / med ball wall). 10x10 ft max, 3 in thick. | kind*, wall*, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.add_wall_padding` | mutate | Add wall padding sections to a wall: height in feet, optional run length (default = full wall), color from the live pad catalog. | wall*, heightFt, lengthFt, offsetFt, fromFloorFt, color | | `fdm.add_window` | mutate | Add a window on an exterior wall (max 3). Every window shows a landscape backdrop from inside. | wall*, kind, position, alongFt | | `fdm.apply_court_layout` | mutate | Replace the courts with a multi-court facility layout: count and columns (or a layout id from get_court_mode). Sizes the building automatically. | layoutId, count, cols, preset, aisleFt | | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.apply_layout_recipe` | **high-impact** (confirm:true) | HIGH IMPACT: replace all equipment with a complete recipe layout sized to the room (e.g. commercial-gym). Uses a saved template for this room size when one exists. | recipe, confirm | | `fdm.apply_pt_clinic` | mutate | Apply a pre-built PT clinic design to a turf zone: switches it to Pro Performance 45 (Florida Blue unless keepTurfColor) and REPLACES its PT inlays with the clinic pieces (editable afterwards with set_pt_inlay). fits:false means the zone is smaller than the layout. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | zoneId*, clinicId*, lineColor, numberColor, keepTurfColor | | `fdm.apply_turf_concept` | mutate | Put a Pre-Built Design Concept on a turf zone (list_turf_concepts). kind ez = art in both end zones (yard lines / hash marks stay separate add-ons via set_zone_markings), full = one graphic over the whole zone. line1 up to 12 letters, line2 up to 16. Colors by name or hex from list_turf_concepts colors. Zone must be Pro Performance 45 - pass switchToPP45:true to switch the zone's turf (same color when available). | zoneId*, design, kind, line1, line2, accentColor, textColor, switchToPP45 | | `fdm.arrange_equipment` | mutate | Re-lay the equipment already on the floor by the commercial-gym rules (racks along the north wall facing in, one bench inside each rack, plate-loaded and selectorized rows, dumbbell/kettlebell racks in a linear row, cardio along the front, clearances and aisles kept, nothing on turf). Columns and wall-mounted items stay. Undoable. | ids, nearWall | | `fdm.classify_commercial_path` | read | Decide whether this design is a simple purchase or needs a custom quotation, with reasons (policy §3A). | | | `fdm.clear_design` | **high-impact** (confirm:true) | Remove everything but the building: equipment, cages and net panels, floor zones and enclosed rooms, wall padding, signage and wall items, doors, windows, interior walls, field enclosures, the running track and the upper floor (room size kept; the base floor stays). | confirm | | `fdm.clear_turf_concept` | mutate | Remove the Pre-Built Design Concept from a turf zone (field lines stay). | zoneId* | | `fdm.create_purchase_link` | **high-impact** (confirm:true) | HIGH IMPACT: for a purchase-path design, build the checkout handoff. Returns the material list; on this page the human completes checkout on kodiaksports.com. | confirm | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Open the PDF export. Landscape document in this order: quote page (facility, spec, estimated total, clickable contents), bill of materials grouped by family with flooring installation details, equipment summary with photos, then the 3D views. The human confirms the download. | | | `fdm.fit_building` | mutate | Shrink-wrap / grow the building around the courts (plus bleachers) with a margin. | marginFt | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_ceiling` | read | Read the ceiling lighting setup (downlights, hex island, linear, wall accent, perimeter, daylight). | | | `fdm.get_court_mode` | read | Current designer mode (basketball / volleyball / pickleball / combo / fieldhouse) and the presets / layouts each sport offers. fieldhouse = mixed multi-sport building (fieldHousePlan shows the starter program). | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_elevated_track` | read | The running track: on/off, level (elevated mezzanine or ground level on the slab), width, height, walls, column spacing, surface, rail, lanes, stairs, plus the takeoff (surface sq ft, lap length and laps per mile, lanes, columns, guardrail feet, stairs, inside-edge feet), warnings (low ceiling, stair fit, track over a court or zone) and price (surface only; structure / lines quoted separately). | | | `fdm.get_enclosure` | read | One field enclosure by zone: settings, doors, takeoff (perimeter, boards lf, glass and net sq ft, posts, doors) and warnings. | zoneId* | | `fdm.get_layers` | read | Canvas view layers for this page (equipment, flooring, vertical posts, netting, exterior walls, interior walls, ceiling and lights, labels, measurements) with their on / off / mixed state, sub-toggles, and the current camera view. View-only - hiding a layer never removes anything from the design or the quote. | | | `fdm.get_levels` | read | Building levels: which level is being edited (1 = ground, 2 = upper floor / mezzanine plan), the view (l1 / l2 / both), whether Level 2 exists, and a Level 2 summary (deck size, items, zones, equipment lines). | | | `fdm.get_parent_link` | read | Whether this design is linked to a Sports Complex building (opened from Edit / design it on the complex plan). Linked designs send their building size (room width / depth / height) back to the complex plan once saved. Returns the complex design id, building slot and the link back to the complex. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.get_upper_floor` | read | The upper floor / mezzanine: on/off, coverage (mezzanine along one wall or full 2nd floor), wall, depth, length, level-2 height, upstairs clear height, stairs, elevator, finish, use, plus the takeoff (deck and usable sq ft, columns, guardrail, stairs, elevator), warnings (low building, courts under a low deck, track conflict, no elevator / accessibility, single exit) and price (finish only; structure quoted separately). | | | `fdm.list_cages` | read | List netting cages. | | | `fdm.list_courts` | read | List courts with sport, preset, size, overlays, goals, bleachers and net. | | | `fdm.list_designs` | read | The signed-in user's saved designs, newest first. | limit | | `fdm.list_doors` | read | List doors (wall, kind, position along the wall, size). | | | `fdm.list_enclosures` | read | Field enclosures (glass dasher boards / containment netting with doors) on this level, plus which zones can take one. Design elements only - never priced. | | | `fdm.list_equipment` | read | List placed equipment. | | | `fdm.list_interior_walls` | read | List interior walls with their sides (which way each side faces, its finish, and the signageWall key to use for lettering). | | | `fdm.list_layout_recipes` | read | Recipes apply_layout_recipe accepts, plus the layout guide (rules the engine follows). | | | `fdm.list_netting` | read | List all netting: cages (with dividers, baffles, doors, color) and freestanding panels. Remove a panel or cage with remove_object. | | | `fdm.list_posts` | read | List vertical posts / structural columns with their positions and pad config. | | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical and, for gyms, by category home / garage / commercial - the same chips the human sees. | category, vertical | | `fdm.list_products` | read | Search the live catalog this page can design with. kind = floor / equipment / wall-finish / wall-pad / net-system. Returns ids to pass to other verbs. | kind*, query, category, limit | | `fdm.list_pt_clinics` | read | Pre-built PT CLINIC turf designs on Pro Performance 45: Signature Clinic - Logo Centre (Navy turf, White lines, ladders + target ring + hopscotch, logo slot in the centre that the human uploads, edge ticks on the turf designer), plus Florida Blue layouts: agility lane, balance & gait, full rehab suite, pediatric play, return to sport. Each = a set of PT training inlays laid down the zone long axis; recommendedAreaFt is the best-fit turf area. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_pt_inlays` | read | PT / athletic-training turf inlays (cut into the turf, colour configurable): agility ladder (boxes x 1-3 rows), agility dots, numbered markers, numbered hopscotch (classic / pairs / 3x3 grid), star-excursion balance star, four-square grid, clock-face targets, three-direction (Y) reach, zigzag path, figure-eight path, footprint stepping path, measured walking lane, jump-distance lane. Made ONLY on Pro Performance 45 turf. Price: 2500 USD custom charge once per turf zone when any inlay is present, plus a per-piece price (own lines in the quote). Returns the catalog with each type's parameters, the inlay colours, and every turf zone with its inlays. COMMERCIAL facilities only (state.gymType commercial) - home gyms return NOT_COMMERCIAL. | | | `fdm.list_racks` | read | Racks and rigs on the floor with their numbered labels (targets for mount_in_rack). | | | `fdm.list_rooms` | read | List enclosed rooms (bathroom / offices / showers / unusable) with their rectangles and any equipment sitting inside them. | | | `fdm.list_signage` | read | List wall lettering / signs. | | | `fdm.list_track_surfaces` | read | Floor products that can be the running surface of the running track (elevated or ground level): Track Flooring OSST (OSSTrax-Elite, 10 colors, pricing pending until its Shopify item is live), Rolled Rubber and Sports Turf from the live catalog, with $/sq ft. | | | `fdm.list_turf_concepts` | read | The 10 Pre-Built Design Concepts for turf zones (end-zone or full-pad inlay graphics with the customer's own two lines of text, auto-scaled to any turf size). Made ONLY on Pro Performance 45 turf. Price: full pad = $7/sq ft on all the zone's turf; end zones = $7/sq ft on the end-zone area only; $3,500 minimum. Also returns the inlay colors and each turf zone's current concept. | | | `fdm.list_upper_floor_finishes` | read | Floor products that can finish level 2 of the upper floor / mezzanine (Rolled Rubber, Sports Turf, Sport Vinyl, Track Flooring from the live catalog) with $/sq ft. | | | `fdm.list_wall_items` | read | List mounted specialty wall panels (band walls, slam walls). | | | `fdm.list_walls` | read | Current wall finishes, wainscot and padding sections. | | | `fdm.list_windows` | read | List windows (wall, kind, position along the wall, size). | | | `fdm.list_zones` | read | List floor zones with products and rectangles. | | | `fdm.mount_in_rack` | mutate | Put a placed barbell in a rack's J-hooks (or take it out). The bar sits across the uprights at squat height and moves with the rack. Racks and bars can be named by their numbered label ("Power Rack 2", "Barbell 1") or placement id - see list_equipment label / list_racks. Visual only; the quote is unchanged. | id*, rack* | | `fdm.move_object` | mutate | Move equipment / cage / zone by id. Equipment and cages: room-centered feet. Zones: room-local NW-origin feet. | id*, position* | | `fdm.open_design` | **high-impact** (confirm:true) | Open one of the saved designs (replaces everything currently on screen - save first if it matters). A design made in a different designer is refused with WRONG_VERTICAL, which names that designer and returns the link to open it there - this page never navigates away mid-call. | id*, confirm | | `fdm.pad_posts` | mutate | Wrap posts in safety padding (sold per vertical foot). Colors: black, navy, royal, forest, maroon, red, gray, purple, sky, tan, kelly, yellow. | posts, color, diameterIn, graphics, heightFt | | `fdm.paint_floor` | mutate | Paint a rectangle of floor squares with a flooring product (or erase paint). Painted squares sit on top of every zone and bill as a second area of that flooring - use it for cut-outs, borders and odd shapes a rectangular zone cannot do. erase:true removes paint in the rect so the zone / primary floor underneath shows again. | product, rect*, erase | | `fdm.place_equipment` | mutate | Place a catalog product (id / Shopify handle / SKU / archetype / name). Omit position and the layout engine finds a free, rule-abiding spot: LIKE KINDS GO IN ROWS (each kind - treadmills, rowers, squat racks, functional trainers - forms its own straight row, extended as you add more; use count:N for one clean row), racks on the north/back wall facing in, dumbbell + kettlebell racks in a linear row on a side wall, cardio rows along the front, clearances kept, nothing on turf. Use nearWall to prefer a wall, inRack:true to put a bench INSIDE the next rack without one. Give position only when the customer named a spot. | product*, position, rotationDeg, count, nearWall, inRack, force | | `fdm.redo` | mutate | Redo the last undone change (same as Ctrl+Y). | | | `fdm.remove_door` | mutate | Remove a door. | id* | | `fdm.remove_elevated_track` | mutate | Turn the running track off, elevated or ground level (its settings are kept if it is turned back on). | | | `fdm.remove_enclosure_door` | mutate | Remove one entry door from a field enclosure. | zoneId*, doorId* | | `fdm.remove_field_enclosure` | mutate | Remove the dasher boards / containment netting from a zone (the zone itself stays). | zoneId* | | `fdm.remove_interior_wall` | mutate | Remove an interior wall (and any signs on it). | id* | | `fdm.remove_net_door` | mutate | Remove a cage entry door by its number (from list_netting). | cageId, number* | | `fdm.remove_object` | mutate | Remove equipment / cage / zone / wall pad section by id. | id* | | `fdm.remove_posts` | mutate | Remove vertical posts (and their padding). posts = all, or a list of numbers / ids. | posts | | `fdm.remove_pt_inlay` | mutate | Remove one PT training inlay (inlayId) or all of them on a zone (all:true). | zoneId*, inlayId, all | | `fdm.remove_room` | mutate | Remove an enclosed room (the floor under it becomes designable again). | id* | | `fdm.remove_signage` | mutate | Remove a sign by id. | id* | | `fdm.remove_upper_floor` | mutate | Turn the upper floor / mezzanine off (settings kept if turned back on). A building height raised automatically for it is restored. | | | `fdm.remove_wall_item` | mutate | Remove a specialty wall panel. | id* | | `fdm.remove_window` | mutate | Remove a window. | id* | | `fdm.rotate_object` | mutate | Rotate equipment / cage by degrees (absolute). | id*, rotationDeg* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save the design to the signed-in account (My Designs). | confirm, name | | `fdm.set_base_floor` | mutate | Set the base flooring that covers everything outside zones. | product* | | `fdm.set_bleachers` | mutate | Toggle bleachers on both long sides of a basketball court (5-25 rows); the building grows to fit. | courtId, enabled, rows | | `fdm.set_cage` | mutate | Resize or re-spec a cage: size, net weight (36/42/60/72/96), net color (blue, black, green, white), divider count and orientation, front/back baffles. | cageId*, lengthFt, widthFt, heightFt, dividers, dividersRotated, netWeight, color, baffleFront, baffleBack | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D orbit), top (floor plan), walk (eye level), front, back, corner-fl, corner-fr, lookup (ceiling), or iso (reset). View-only. | view* | | `fdm.set_ceiling_lighting` | mutate | Configure the ceiling light systems. Any mix of: downlights (grids of can lights over floor zones), hexGrid (hexagonal LED island), linear (LED strip), wallAccent (wall wash from the ceiling), perimeter (LED strip along the wall/ceiling seam), plus daylight (1 sun .. 0 night), brightness, and visible (show/hide the whole ceiling). Omit a system to leave it alone; {on:false} turns it off. | downlights, hexGrid, linear, wallAccent, perimeter, daylight, brightness, visible | | `fdm.set_court_mode` | mutate | Switch the designer mode. combo = high-school basketball court with volleyball lines in a second color and the net on the half-court line. fieldhouse = Field House: mixed basketball / volleyball / pickleball courts in one building + Fitness Area + turf lane + elevated track; existing courts are KEPT as-is and add_court takes any sport. Other modes convert existing courts in place. A fresh design (or reseed:true) is re-seeded. | mode*, reseed, noSeed, program | | `fdm.set_court_preset` | mutate | Change a court's size preset (e.g. high-school → ncaa) and refit the zone. | courtId, preset* | | `fdm.set_elevated_track` | mutate | Add or change the running track around the room. level elevated (default: a wall-attached mezzanine with support columns to the floor) or ground (the same loop laid on the slab: surface + lane lines + inside-edge transition, no deck / columns / rail / stairs; heightFt, postSpacingFt, railing and stairs are ignored; floor zones must sit inside the loop). Any field is optional; enabled:true turns it on. widthFt 6-20, heightFt 10-20 (default 15), postSpacingFt 10-30 (default 25), cornerRadiusFt 0-40 (default 12: inside corners are rounded where two sides meet, lane lines and rail run as one continuous loop; clamped to fit the room), walls = which walls it runs along (north/east/south/west; all four = full loop), surfaceFloorId from list_track_surfaces, stairs 0-4, firstStairWall. The room needs a ceiling of heightFt + 8 ft; pass raiseCeiling:true to raise it automatically. Rectangular rooms only. | enabled, level, widthFt, heightFt, postSpacingFt, cornerRadiusFt, walls, surfaceFloorId, railing, laneLines, stairs, firstStairWall, raiseCeiling | | `fdm.set_field_enclosure` | mutate | Wrap a turf field / floor zone with glass dasher boards (soccer, lacrosse, hockey), containment netting on posts with optional top netting, or both; add entry doors in the boards. Creates the enclosure on first call; later calls change any field. Non-saleable design elements: never priced or added to the cart, listed on the PDF for the building team. | zoneId*, kind, boardHeightFt, glassHeightFt, netHeightFt, topNet, netColor, postSpacingFt, insetFt, doors | | `fdm.set_goals` | mutate | Basketball goal style (ceiling / wall / floor) and rim height. | courtId, style, rimFt, enabled | | `fdm.set_gym_type` | mutate | Switch the facility type: commercial (18 ft ceiling default) or home / garage gym (10 ft ceiling, ceiling fixtures hidden). Same defaults the Room panel applies. | type* | | `fdm.set_layer` | read | Show or hide a canvas view layer, or one of its sub-toggles (e.g. layer labels, toggle equipment_labels). Layer ids come from get_layers. Optional netColor blue / black previews the netting color. View-only. | layer*, on, toggle, netColor | | `fdm.set_level` | mutate | Switch the building level being edited. view l1 = ground floor (default), l2 = the upper floor / mezzanine plan (all floor, equipment, padding and signage verbs then act on level 2, kept inside the deck), both = level 1 editable with level 2 shown on the deck. Needs an upper floor (set_upper_floor). | view* | | `fdm.set_net` | mutate | Volleyball / pickleball net on a court: on/off, height (ft), referee stand, antennae. | courtId, enabled, heightFt, refStand, antennae | | `fdm.set_net_product` | mutate | Choose the volleyball net system product for a court from the live catalog (list_products kind=net-system); prices the net line and sets in-ground vs portable rendering. null clears it. | courtId, product | | `fdm.set_placement_variant` | mutate | Switch a placed product between its display variants (visual only - same product, SKU and price in the quote). Today: barbells with a "loaded" variant show the bar WITH bumper plates on it. list_equipment / list_products show variants[] on records that have any; pass variant "none" to go back to the plain product. | id*, variant* | | `fdm.set_pt_inlay` | mutate | Change a PT training inlay: params, colours, rotation (0/90/180/270) or position (offsetFt from the zone centre). | zoneId*, inlayId*, params, lineColor, numberColor, rotDeg, offsetFt | | `fdm.set_room` | mutate | Set the building size (interior feet). Zones and equipment that no longer fit are pulled back inside. | widthFt, depthFt, heightFt, name | | `fdm.set_upper_floor` | mutate | Add or change the upper floor. coverage mezzanine (a deck along one wall: depthFt 10-150, spanPct 20-100 of that wall, centred) or full (whole footprint). wall north/east/south/west = the mezzanine wall and where stairs + elevator sit. levelFt 9-32 = level-2 floor height, upperClearFt 8-24 = upstairs ceiling; with autoCeiling (default on) the building height rises to levelFt + upperClearFt and is restored when the floor is removed. stairs 1-3 switchback stairs, elevator (accessible, default on), railing, surfaceFloorId from list_upper_floor_finishes ("" = none), use multi/fitness/offices/viewing/party/storage, show (3D visibility, view only). Rectangular buildings only. | enabled, coverage, wall, depthFt, spanPct, levelFt, upperClearFt, autoCeiling, columnSpacingFt, stairs, elevator, railing, surfaceFloorId, use, show | | `fdm.set_wainscot` | mutate | Apply a wainscot (lower band) finish to a wall or all walls. | wall, finish* | | `fdm.set_wall_design` | mutate | Put a full-wall painted mural design on a wall: brushgrit (Brush + Text), peak (Mountain Peak), hexpower (Hexagons), geometric, arrows (Chevrons), heartbeat, topo (Topographic), splatter (Impact Splatter). Colorways: red, yellow (gold), orange, green, blue, cyan (ice), purple, sage, mono. brushgrit and peak take a headline text. Use set_wall_paint to go back to plain paint. | wall, walls, design*, colorway, headline | | `fdm.set_wall_paint` | mutate | Paint / finish a wall (or all walls). finish = color name, finish id, or hex (#2a2a2a → nearest paint). | wall, finish*, walls | | `fdm.set_zone_markings` | mutate | Turf-lane markings: yard lines every 5 yards, hash marks every yard, and painted floor text along the lane (e.g. a brand name in white). Lines are white. Works on turf-lane zones from add_floor_zone / list_zones whose turf product is custom-eligible (CUSTOMTURF_Yes); stock turf returns NOT_AVAILABLE - pick a custom-eligible turf via list_products kind=floor first. | zoneId*, yardLines, hashMarks, text, textColor, textHeightFt | | `fdm.set_zone_product` | mutate | Change the flooring product of a zone. | zoneId*, product* | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: submit the current design + material list for a custom quotation (saves the design, generates the PDF, emails the quote team). Requires a signed-in user and confirm:true. | confirm, note | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.update_door` | mutate | Move a door along or to another wall, change its kind, opening height (overhead/garage) or garage width. | id*, wall, kind, position, alongFt, heightFt, garageWidthFt | | `fdm.update_enclosure_door` | mutate | Move or re-spec an enclosure door (side, alongFt, widthFt, kind). | zoneId*, doorId*, side, alongFt, widthFt, kind | | `fdm.update_interior_wall` | mutate | Move, resize, rotate (orientation), repaint or hide an interior wall. | id*, enabled, orientation, center, lengthFt, heightFt, finish, finishSide1, finishSide2 | | `fdm.update_net_panel` | mutate | Move, resize, rotate, re-spec or add/remove the door on a netting panel. | id*, widthFt, heightFt, position, rotationDeg, netWeight, color, door | | `fdm.update_room` | mutate | Move, resize, relabel, rotate or change the variant of an enclosed room. | id*, kind, label, variant, wFt, dFt, corner, alongWall, alongFt, rect, rotationDeg | | `fdm.update_signage` | mutate | Change a sign: text, color, backlight, letter height, position, wall (exterior or interior wall side). | id*, interiorWall, side, text, color, backlight, letterHeightFt, wall, position | | `fdm.update_wall_item` | mutate | Move or resize a specialty wall panel, or move it to another wall. | id*, wall, alongFt, centerHeightFt, widthFt, heightFt | | `fdm.update_wall_padding` | mutate | Change one wall padding section: color, height, run length, position along the wall, or height off the floor. Remove with remove_object. | id*, color, heightFt, lengthFt, offsetFt, fromFloorFt | | `fdm.update_window` | mutate | Move a window along or to another wall, or change its kind. | id*, wall, kind, position, alongFt | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Indoor Turf Designer (`indoor-turf`) URL: `/indoor-turf/` — manifest: `/indoor-turf/capabilities.json` — 45 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.add_pt_inlay` | mutate | Add a PT training inlay to the pad (types / params from list_pt_inlays). Placed at the pad centre unless offsetFt is given (+x right, +z toward the north end); long axis follows the pad unless rotDeg is given. Requires Pro Performance 45 (set_turf_product first). | type*, params, lineColor, numberColor, rotDeg, offsetFt | | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.apply_preset` | mutate | Apply a HYROX pre-built layout by id (see list_presets). Locks product to Pro Performance 45, turf defaults to Black, lines to White; optional lengthFt and lineColor. | presetId*, lengthFt, lineColor | | `fdm.apply_pt_clinic` | mutate | Apply a pre-built PT clinic design: switches the pad to Pro Performance 45 (Florida Blue unless keepTurfColor), grows the pad to the recommended length if shorter, and REPLACES all PT inlays with the clinic pieces. Pieces stay editable with set_pt_inlay. | clinicId*, lineColor, numberColor, keepTurfColor | | `fdm.apply_turf_art` | mutate | Apply a custom turf design (see list_turf_art). kind end-zones = both end zones over the normal yard-line field (yard lines + hash marks start ON); kind full = the design covers the whole pad (markings start OFF). Locks the product to Pro Performance 45 and defaults the turf to Black. line1 / line2 are the customer lettering; inlayColor1 (main) and inlayColor2 (accent) are colors of the locked product. | designId*, kind*, line1, line2, endZoneDepthFt, inlayColor1, inlayColor2 | | `fdm.classify_commercial_path` | read | Purchase vs custom quotation for this turf design, with reasons (policy §3A). | | | `fdm.clear_preset` | mutate | Remove the HYROX layout and unlock product / width / roll direction. | | | `fdm.clear_sled_lanes` | mutate | Remove the sled lane striped design (pad goes back to one solid colour). | | | `fdm.clear_turf_art` | mutate | Remove the custom turf design and unlock the product. | | | `fdm.create_purchase_link` | **high-impact** (confirm:true) | HIGH IMPACT: build the kodiaksports.com cart link for a purchase-path pad (product variant x kit square feet). Human completes checkout. | confirm | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Run the PDF export (5 camera shots + takeoff). prices:false = takeoff only (design views, dimensions and quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.list_presets` | read | Pre-built layouts (HYROX 2-lane / 4-lane variants) with fixed widths, minimum lengths and the custom design charge. | | | `fdm.list_products` | read | Live turf products (styles), their colors, padding levels and $/sq ft. Use the ids with set_turf_product. | query | | `fdm.list_pt_clinics` | read | Pre-built PT CLINIC turf designs on Pro Performance 45: Signature Clinic - Logo Centre (Navy turf, White lines, ladders + target ring + hopscotch, logo slot in the centre that the human uploads, edge ticks on the turf designer), plus Florida Blue layouts: agility lane, balance & gait, full rehab suite, pediatric play, return to sport. Each = a set of PT training inlays laid end-to-end down a 15 ft wide pad, with the recommended pad size. | | | `fdm.list_pt_inlays` | read | PT / athletic-training inlays cut into the pad (colour configurable): agility ladder (boxes x 1-3 rows), agility dots, numbered markers, numbered hopscotch (classic / pairs / 3x3 grid), star-excursion balance star, four-square grid, clock-face targets, three-direction (Y) reach, zigzag path, figure-eight path, footprint stepping path, measured walking lane, jump-distance lane. Made ONLY on Pro Performance 45. Price: 2500 USD custom charge once per pad when any inlay is present, plus a per-piece price (own lines in the estimate). Returns the catalog with parameters, the product colours and the inlays on the pad. | | | `fdm.list_turf_art` | read | Custom turf art library: 10 designs, each usable as END ZONES (both ends of a yard-line field) or as a FULL-PAD design. Customer text (line1 / line2) and two inlay colors; every design redraws to fit any pad size. Pro Performance 45 only; adds $7/sq ft of pad, $3,500 minimum. | | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.remove_logo` | mutate | Clear a logo slot (1-3). | slot* | | `fdm.remove_pt_inlay` | mutate | Remove one PT training inlay (inlayId) or all of them (all:true). | inlayId, all | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_hyrox_custom` | mutate | HYROX CUSTOM SIZE layout: any pad width x length with any lane count (1-12); lanes divide the full width (e.g. 30 x 85 ft, 3 lanes = three 10 ft lanes). Optional end zone depth (2-30 ft, default 5.5), mid zone (0 = none), line color. border = perimeter white line, OFF by default, paid option: 2 USD per sq ft of pad, 2000 USD minimum. Applies the hyrox-custom card if not active; locks product to Pro Performance 45; same flat HYROX design charge. | widthFt, lengthFt, lanes, endZoneFt, midZoneFt, border, lineColor | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.set_line_color` | mutate | HYROX line color (a color of the locked product). | color* | | `fdm.set_logo` | mutate | Put an inlaid logo on the pad (slots 1-3) from an image data URL (PNG/JPG/SVG, max 1.5 MB) - what the Logo file picker does, so a saved design or a spec can carry the logo. place = ez_n / ez_mid / ez_s. posFt / rotDeg move it like a dragged decal. Omit dataUrl to only move / re-place an existing logo. | slot*, dataUrl, place, posFt, rotDeg | | `fdm.set_markings` | mutate | Yard lines and hash marks (custom-eligible products only). Hash marks add a $2,450 / $2,750 custom charge. | yardLines, hashMarks, hashColor | | `fdm.set_pad` | mutate | Set the turf pad size in feet (width x length). HYROX fixed layouts fix the width (15 ft for 4-lane, 7.5 ft for 2-lane); the HYROX custom-size layout takes any width (use set_hyrox_custom). | widthFt, lengthFt | | `fdm.set_pt_inlay` | mutate | Change a PT training inlay: params, colours, rotation (0/90/180/270) or position (offsetFt from the pad centre). | inlayId*, params, lineColor, numberColor, rotDeg, offsetFt | | `fdm.set_roll_direction` | mutate | Direction the turf rolls run: lengthwise (along the pad length) or widthwise. Yard lines force widthwise rolls. | direction* | | `fdm.set_sled_lanes` | mutate | SLED LANE STRIPED design: divide the pad width into N lanes running lengthwise (1-12, min 2 ft per lane), a 4 in White line inlaid between lanes, one Pro Performance 45 colour per lane (colour names, e.g. ["Florida Blue","Black"] alternates). Locks the product to Pro Performance 45. Set the pad width/length with set_pad (material is 15 ft rolls). Omitted colours repeat the given pattern. | lanes, colors | | `fdm.set_text` | mutate | Put an inlaid text decal on the pad (slots 1-3). place = ez_n / ez_mid / ez_s (north end zone, middle, south end zone). Empty text clears the slot. | slot*, text, color, place, posFt, rotDeg | | `fdm.set_turf_product` | mutate | Pick the turf product: style (e.g. "Pro Performance 45"), color (e.g. "Black") and padding level (e.g. "5mm Pad" / "No Pad"). | style, color, padding | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation. On this page that means exporting the PDF (design + takeoff) for the human to send; returns the material list. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Baseball / Softball Field Designer (`baseball`) URL: `/ui_kits/fdm_designer/verticals/baseball/` — manifest: `/ui_kits/fdm_designer/verticals/baseball/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Soccer Field Designer (`soccer`) URL: `/ui_kits/fdm_designer/verticals/soccer/` — manifest: `/ui_kits/fdm_designer/verticals/soccer/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Football Field Designer (`football`) URL: `/ui_kits/fdm_designer/verticals/football/` — manifest: `/ui_kits/fdm_designer/verticals/football/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Lacrosse Field Designer (`lacrosse`) URL: `/ui_kits/fdm_designer/verticals/lacrosse/` — manifest: `/ui_kits/fdm_designer/verticals/lacrosse/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Rugby Field Designer (`rugby`) URL: `/ui_kits/fdm_designer/verticals/rugby/` — manifest: `/ui_kits/fdm_designer/verticals/rugby/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Field Hockey Designer (`field-hockey`) URL: `/ui_kits/fdm_designer/verticals/field-hockey/` — manifest: `/ui_kits/fdm_designer/verticals/field-hockey/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Sand Volleyball Court Designer (`sand-volleyball`) URL: `/ui_kits/fdm_designer/verticals/sand-volleyball/` — manifest: `/ui_kits/fdm_designer/verticals/sand-volleyball/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Bocce Court Designer (`bocce`) URL: `/ui_kits/fdm_designer/verticals/bocce/` — manifest: `/ui_kits/fdm_designer/verticals/bocce/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Pickleball Court Designer (`pickleball`) URL: `/ui_kits/fdm_designer/verticals/pickleball/` — manifest: `/ui_kits/fdm_designer/verticals/pickleball/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Putting Green Designer (`putting-green`) URL: `/ui_kits/fdm_designer/verticals/putting-green/` — manifest: `/ui_kits/fdm_designer/verticals/putting-green/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Sports Complex Designer (`sports-complex`) URL: `/ui_kits/fdm_designer/verticals/sports-complex/` — manifest: `/ui_kits/fdm_designer/verticals/sports-complex/capabilities.json` — 31 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.add_site_building` | mutate | Place a building on the campus. btype fieldhouse / indoor-batting / outdoor-cages / gym. Optional name, x / z (feet, site coordinates; default = a free spot east of the fields) and w / d / h. Size later follows the linked facility design. | btype*, name, x, z, w, d, h | | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.list_site_buildings` | read | Buildings on the campus plan (Field House, indoor batting facility, outdoor batting cages, gym / fitness building): id, type, name, position, size, whether a facility design is linked, and the link that opens its facility designer. Also lists the building types and their default sizes. | | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.open_site_building` | **high-impact** (confirm:true) | HIGH IMPACT (saves the complex): get the link that opens a building in its facility designer (Field House -> Field House Designer, indoor batting / outdoor cages -> Batting Cage Designer, gym -> Indoor Gym Designer). Saves the complex first when it is new or has unsaved changes, so the facility links back. Returns the url for the person to open - this page never navigates away mid-call. | id*, confirm | | `fdm.remove_site_building` | **high-impact** (confirm:true) | HIGH IMPACT: remove a building from the campus. A linked facility design is kept in My Designs (only the building on the plan goes). | id*, confirm | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.set_site_building` | mutate | Move, rotate, rename or resize a building by id (see list_site_buildings). A linked facility design re-syncs its size the next time the complex syncs. | id*, name, x, z, rotDeg, w, d, h | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.sync_site_buildings` | mutate | Pull the saved building size (width / depth / height) of every facility design linked to this complex onto its building on the plan. Runs automatically when the complex tab regains focus. | | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Turf Halo Designer (`turf-halo`) URL: `/turf-halo/` — manifest: `/turf-halo/capabilities.json` — 25 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.list_designs` | read | List the signed-in person's saved designs (newest first). Default: this designer only (max 50). all:true lists every designer (max 200), each tagged with its vertical, label and the link that opens it - the same folders the My Designs window shows. | all | | `fdm.list_premade_designs` | read | Pre-made (template) designs from My Designs > Pre-Made Designs. Filter by designer vertical (default: every vertical). Each row carries its vertical and whether it opens on this page. | vertical | | `fdm.open_design` | mutate | Open one of the person's saved designs by id (see list_designs). Replaces the current layout. A design made in a different designer is refused with WRONG_VERTICAL plus the link to open it there - this page never navigates away mid-call. | id* | | `fdm.save_design` | **high-impact** (confirm:true) | HIGH IMPACT: save this design to the signed-in account (My Designs > this designer > Your Custom Designs). Updates the open design; name + asNew:true saves a new copy. Uses the plan design limit. | confirm, name, asNew | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.use_premade_design` | **high-impact** (confirm:true) | Start a NEW unsaved design from a pre-made layout (replaces everything on screen - save first if it matters). The master template is never modified. A pre-made from a different designer is refused with WRONG_VERTICAL plus the link to open it there. | id*, confirm | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | | ## Boat & RV Storage Facility Designer (`boat-rv-storage`) URL: `/boat-rv-storage/` — manifest: `/boat-rv-storage/capabilities.json` — 36 verbs. | verb | kind | what it does | params (* = required) | |---|---|---|---| | `fdm.add_building` | mutate | Add a building. type: rv_row (boat/RV bays, 14 ft clear rule), mini_row (mini storage, roll-ups), canopy (covered open-sided), office. Optional length (building length ft, snaps to whole bays), units, unitW (bay width ft), d (depth ft), h (eave height ft), doorType swing/rollup/sectional/open, doorClear ft, loading single/double, construction steel/cmu/tiltup/wood, colors {wall,roof,trim,door} (MBCI ids), cx/cz/rotDeg. | type*, length, units, unitW, d, h, doorType, doorClear, loading, construction, colors, cx, cz, rotDeg, label | | `fdm.add_camera` | mutate | Place a camera: sub lte (solar/cellular, 180 deg) / wired (90 deg) at cx,cz, mountFt, aimDeg. | sub, cx*, cz*, mountFt, aimDeg | | `fdm.add_light` | mutate | Place a light fixture: sub eave / pole / wallpack / posttop at cx,cz with mountFt, lumens, aimDeg (rotation) and scope exterior / entry. | sub*, cx*, cz*, mountFt, lumens, aimDeg, scope, twin | | `fdm.add_open_stalls` | mutate | Add an open-lot stall zone (w x d at cx,cz) filled with stalls of stallW x stallD at angle 90/60/45 around aisles of aisle ft; stalls clip to the property line and skip buildings. | cx*, cz*, w*, d*, rotDeg, stallW, stallD, angle, aisle, oneWay | | `fdm.add_surface_zone` | mutate | Paint a rectangular surface zone (gravel / concrete / asphalt / pavers) of w x d ft centred at cx,cz with a depthIn and, for concrete, psi / rebarSize / rebarSp. | surface*, cx*, cz*, w*, d*, rotDeg, depthIn, psi, rebarSize, rebarSp, label | | `fdm.apply_design_spec` | mutate | Apply a full or partial Design Spec (feet / degrees JSON). dryRun returns the plan without changing the design. spec.replace:true clears the whole building first (zones, equipment, doors, windows, walls, track, upper floor, enclosures) so the spec is the entire design; otherwise sections merge onto what is on screen. | spec*, dryRun | | `fdm.classify_commercial_path` | read | Purchase vs quotation for this design (field designs are always quotation). | | | `fdm.click_action` | mutate | Press a designer action button by id (see list_controls.actions), e.g. open the field-setup editor or apply a layout. | id* | | `fdm.describe_capabilities` | read | Return the machine-readable capabilities of this designer page: verbs with schemas, units, limits, commercial policy. | | | `fdm.export_pdf` | mutate | Export the design PDF (framed 3D view, 4 corner views, top view + every takeoff panel). prices:false = takeoff only (design + dimensions + quantities, every $ row removed). The browser prompts the human to save. | prices | | `fdm.export_takeoff_csv` | read | The take-off as CSV text (Section, Item, Qty, Unit, Detail, Phase). | | | `fdm.get_access_status` | read | Registration and plan status: whether a registered person is signed in on this page, their plan and remaining saved designs, and the access policy - the free registration plan, the paid upgrade plans with prices, the AI Design Assistant add-on, Terms / Privacy / pricing URLs and any preview media. Call this before designing for someone: every design-changing verb needs a signed-in, registered person. | | | `fdm.get_bom` | read | Structured bill of materials: equipment, flooring areas, netting, accessories, wall padding, post padding, running track and upper floor lines, with totals. Never scraped from HTML. | | | `fdm.get_design` | read | Return the current Design Spec (feet / degrees JSON) for this page. | | | `fdm.get_layers` | read | Canvas view layers for this page (field grid + snap, roll layout, size labels) with their on / off state, and the current camera view (persp = 3D fit, top = plan). View-only - hiding a layer never changes the takeoff. | | | `fdm.get_pricing` | read | Budgetary totals by family plus freight and grand total (USD). | | | `fdm.get_readouts` | read | Parsed dimension and takeoff rows (#dims / #bom) with numbers and dollar values extracted. | | | `fdm.get_site` | read | Lot polygon (feet, origin at site centre, +z = back), area, perimeter, setback line, base surface, and every placed object (buildings, surface zones, open-stall zones, lights, cameras, gates, vehicles). | | | `fdm.get_summary` | read | Plain-language summary of the current design: room size, zones, cages, equipment count, walls, totals. | | | `fdm.get_takeoff` | read | The full budgetary take-off: site areas, base + surface zones (gravel cy/tons, concrete cy, rebar lf/lb, asphalt tons), per-building envelope (roof / wall / partition / liner sf, trim, doors, CMU blocks, frames est), unit schedule, fence net of perimeter buildings, open stalls, lighting, security, warnings. | | | `fdm.list_buildings` | read | Buildings on the site with type, letter, size, units, doors, construction and colours. | | | `fdm.list_controls` | read | Every control on this designer: id, label, section, type, current value, options / ranges. Use the ids with set_control. | onlyVisible | | `fdm.place_vehicle` | mutate | Place a vehicle proxy (ids from the Vehicles control: classA_40, fifth_35, boat_24t, pickup …) at cx,cz with rotDeg; drop it inside a bay to test door clearance (see get_takeoff.warnings). | vid*, cx*, cz*, rotDeg | | `fdm.remove_object` | mutate | Remove any placed object by id (building, zone, light, camera, vehicle …). | id* | | `fdm.set_base_surface` | mutate | Lot-wide base surface: dirt (default, unimproved) / gravel / concrete / asphalt (warned - not for RV aisles), with depthIn. | surface*, depthIn | | `fdm.set_building` | mutate | Change one building by id: any of length (ft, snaps to whole bays), units, unitW, d, h, doorType, doorClear, loading, construction, roof, pitch, colors, label, unitStart, phase, cx, cz, rotDeg. | id*, patch* | | `fdm.set_camera_view` | read | Move the camera to a preset view: persp (3D, refit), top (plan view) or iso (reset). View-only. | view* | | `fdm.set_control` | mutate | Set one control by id (number, select value or label, checkbox boolean, text). Fires the same events a human click does. | id*, value | | `fdm.set_controls` | mutate | Set several controls at once: values = { id: value }. Applied in order; stops at the first error. | values* | | `fdm.set_layer` | read | Show or hide a canvas view layer (ids from get_layers). View-only. | layer*, on | | `fdm.set_lot` | mutate | Set the parcel: w + d (rectangle, ft) or pts [{x,z}] (any polygon), plus setbackFront / setbackSide / setbackRear ft. | w, d, pts, setbackFront, setbackSide, setbackRear | | `fdm.set_night_view` | read | Night view: dark sky, fixtures glow, lit pools on the ground (estimate, not a photometric plan). View-only. | on* | | `fdm.snap_building_to_edge` | mutate | Run a building along property edge i (from get_site.lot.edges) with its back wall at the setback and doors facing the lot - perimeter buildings replace fence on that run. | id*, edge* | | `fdm.submit_for_quotation` | **high-impact** (confirm:true) | HIGH IMPACT: hand the design off for a custom quotation (exports the PDF takeoff for the human to send). Requires confirm:true. | confirm | | `fdm.undo` | mutate | Undo the last change (same as Ctrl+Z). | | | `fdm.validate_design` | read | Run the design validators (fit, clearances, envelopes) and return findings. | |