Skip to main content
Glama

plan_layout

Read-onlyIdempotent

Converts a saved factory plan into a build schematic showing blocks, buses, floors, materials, and space budget, with belt/pipe tiers solved to match the plan.

Instructions

Plan to schematic: blocks, buses, floors, materials, space budget; no coordinates or belt routing (site_plan places it).

The belt/pipe tier is solved with, so schematic and plan agree.

Input Schema

NameRequiredDescriptionDefault
planYesa saved plan's name or pin:N, or the solve: handle plan_factory printed
saveNo
showNofloors | blocks | buses | trunks | materials | sitesfloors
as_ofNopin to one save: the sav:… token an earlier answer printed
limitNo
sitesNoshow="sites": {"rig": ["Heavy Oil Residue"], "hall": ["MW"]}; "MW" claims every generator
worldNo
factoryNofit against this factory's existing platform
belt_tierNobelt tier name; blank = fastest unlocked
pipe_tierNopipe tier name; blank = fastest unlocked
order_floors_byNo"chain" (build order) or "head" (minimise fluid lift)chain
max_floor_foundationsNocap a deck at this many 8m foundations; 0 = one stage per deck

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed54 schema fields changedv0.3.0
    • removedInput schema / properties / allow_sinks
      Removed value: -{
      -  "default": true,
      -  "title": "Allow Sinks",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / as_of / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • changedInput schema / properties / as_of / description
      Previous value: -"pin to one world state: a sav:… token from an earlier answer"New value: +"pin to one save: the sav:… token an earlier answer printed"
    • removedInput schema / properties / as_of / title
      Removed value: -"As Of"
    • addedInput schema / properties / as_of / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedInput schema / properties / belt_tier / description
      Previous value: -"belt tier name; blank = the fastest you have unlocked"New value: +"belt tier name; blank = fastest unlocked"
    • removedInput schema / properties / belt_tier / title
      Removed value: -"Belt Tier"
    • removedInput schema / properties / clocks
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "number"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Clocks"
      -}
    • removedInput schema / properties / detail
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "retired -- write show= instead",
      -  "title": "Detail"
      -}
    • removedInput schema / properties / exclude_recipes
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Exclude Recipes"
      -}
    • removedInput schema / properties / export_minimums
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "additionalProperties": {
      -        "type": "number"
      -      },
      -      "type": "object"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Export Minimums"
      -}
    • removedInput schema / properties / exports
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Exports"
      -}
    • removedInput schema / properties / extractor_clocks
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "number"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Extractor Clocks"
      -}
    • removedInput schema / properties / factory / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • changedInput schema / properties / factory / description
      Previous value: -"fit the layout against this factory's existing platform"New value: +"fit against this factory's existing platform"
    • removedInput schema / properties / factory / title
      Removed value: -"Factory"
    • addedInput schema / properties / factory / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / limit / description
      Removed value: -"max rows (hard cap 25)"
    • removedInput schema / properties / limit / title
      Removed value: -"Limit"
    • removedInput schema / properties / machine_cost_mw
      Removed value: -{
      -  "default": 5,
      -  "title": "Machine Cost Mw",
      -  "type": "number"
      -}
    • removedInput schema / properties / max_floor_foundations / title
      Removed value: -"Max Floor Foundations"
    • removedInput schema / properties / objective
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "omitted: min_raw_power with export_minimums, else max_mw",
      -  "title": "Objective"
      -}
    • removedInput schema / properties / only_free_nodes
      Removed value: -{
      -  "default": false,
      -  "title": "Only Free Nodes",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / only_recipes
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Only Recipes"
      -}
    • removedInput schema / properties / order_floors_by / title
      Removed value: -"Order Floors By"
    • removedInput schema / properties / overclock_last
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "boolean"
      -    },
      -    {
      -      "const": "default",
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "build a row one machine short, the last one overclocked (1-2 Power Shards, checked against shards in hand plus those craftable from slugs); 'default' follows the shared setting",
      -  "title": "Overclock Last"
      -}
    • removedInput schema / properties / payback_hours
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "number"
      -    },
      -    {
      -      "const": "default",
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "hours of play extra, slower machines must repay in saved power: 0 builds plainly; stops 1, 2, 5, 10, 20, 50, 100; 'default' follows the shared setting. Stored per plan",
      -  "title": "Payback Hours"
      -}
    • changedInput schema / properties / pipe_tier / description
      Previous value: -"pipe tier name; blank = the fastest you have unlocked"New value: +"pipe tier name; blank = fastest unlocked"
    • removedInput schema / properties / pipe_tier / title
      Removed value: -"Pipe Tier"
    • removedInput schema / properties / plan / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / plan / default
      Removed value: -null
    • changedInput schema / properties / plan / description
      Previous value: -"recall a saved plan by name"New value: +"a saved plan's name or pin:N, or the solve: handle plan_factory printed"
    • removedInput schema / properties / plan / title
      Removed value: -"Plan"
    • addedInput schema / properties / plan / type
      Added value: +"string"
    • removedInput schema / properties / power_price
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "number"
      -    },
      -    {
      -      "const": "default",
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "points per MWh the horizon prices power at; omit for the save's grid mix, 'default' puts a stored plan back on it",
      -  "title": "Power Price"
      -}
    • removedInput schema / properties / row_overclock
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "additionalProperties": {
      -        "enum": [
      -          "last",
      -          "spread",
      -          "default"
      -        ],
      -        "type": "string"
      -      },
      -      "type": "object"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "per recipe (exact name or class id): 'last' overclocks that row's last machine, 'spread' builds one more underclocked machine instead, 'default' follows overclock_last again. Overrides overclock_last for that row; rows not named keep their stored choice",
      -  "title": "Row Overclock"
      -}
    • removedInput schema / properties / save / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / save / title
      Removed value: -"Save"
    • addedInput schema / properties / save / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / show / title
      Removed value: -"Show"
    • addedInput schema / properties / sites / additionalProperties
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • removedInput schema / properties / sites / anyOf
      Removed value: -[
      -  {
      -    "additionalProperties": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • changedInput schema / properties / sites / description
      Previous value: -"show=\"sites\": {\"rig\": [\"Heavy Oil Residue\", ...], \"hall\": [\"MW\"]} -- MW/power claims every generator"New value: +"show=\"sites\": {\"rig\": [\"Heavy Oil Residue\"], \"hall\": [\"MW\"]}; \"MW\" claims every generator"
    • removedInput schema / properties / sites / title
      Removed value: -"Sites"
    • addedInput schema / properties / sites / type
      Added value: +[
      +  "object",
      +  "null"
      +]
    • removedInput schema / properties / sloops
      Removed value: -{
      -  "default": 0,
      -  "description": "Somersloops the plan may spend; 0 spends none",
      -  "title": "Sloops",
      -  "type": "integer"
      -}
    • removedInput schema / properties / sources
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Sources"
      -}
    • removedInput schema / properties / target_item
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Target Item"
      -}
    • removedInput schema / properties / water_extractors
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "integer"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "how many Water Extractors your site can actually hold",
      -  "title": "Water Extractors"
      -}
    • removedInput schema / properties / world / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / world / title
      Removed value: -"World"
    • addedInput schema / properties / world / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / required
      Added value: +[
      +  "plan"
      +]
    • removedInput schema / title
      Removed value: -"plan_layoutArguments"
  2. Changed8 schema fields changedv0.2.0
    • addedInput schema / properties / objective / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / objective / default
      Previous value: -"max_mw"New value: +null
    • addedInput schema / properties / objective / description
      Added value: +"omitted: min_raw_power with export_minimums, else max_mw"
    • removedInput schema / properties / objective / type
      Removed value: -"string"
    • addedInput schema / properties / overclock_last
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "const": "default",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "build a row one machine short, the last one overclocked (1-2 Power Shards, checked against shards in hand plus those craftable from slugs); 'default' follows the shared setting",
      +  "title": "Overclock Last"
      +}
    • addedInput schema / properties / payback_hours
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "const": "default",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "hours of play extra, slower machines must repay in saved power: 0 builds plainly; stops 1, 2, 5, 10, 20, 50, 100; 'default' follows the shared setting. Stored per plan",
      +  "title": "Payback Hours"
      +}
    • addedInput schema / properties / power_price
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "const": "default",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "points per MWh the horizon prices power at; omit for the save's grid mix, 'default' puts a stored plan back on it",
      +  "title": "Power Price"
      +}
    • addedInput schema / properties / row_overclock
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "enum": [
      +          "last",
      +          "spread",
      +          "default"
      +        ],
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "per recipe (exact name or class id): 'last' overclocks that row's last machine, 'spread' builds one more underclocked machine instead, 'default' follows overclock_last again. Overrides overclock_last for that row; rows not named keep their stored choice",
      +  "title": "Row Overclock"
      +}
  3. Changed7 schema fields changed
    • addedInput schema / properties / as_of
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "pin to one world state: a sav:… token from an earlier answer",
      +  "title": "As Of"
      +}
    • addedInput schema / properties / detail / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / detail / default
      Previous value: -"floors"New value: +null
    • addedInput schema / properties / detail / description
      Added value: +"retired -- write show= instead"
    • removedInput schema / properties / detail / type
      Removed value: -"string"
    • addedInput schema / properties / show
      Added value: +{
      +  "default": "floors",
      +  "description": "floors | blocks | buses | trunks | materials | sites",
      +  "title": "Show",
      +  "type": "string"
      +}
    • changedInput schema / properties / sites / description
      Previous value: -"detail=\"sites\": {\"rig\": [\"Heavy Oil Residue\", ...], ...}"New value: +"show=\"sites\": {\"rig\": [\"Heavy Oil Residue\", ...], \"hall\": [\"MW\"]} -- MW/power claims every generator"
  4. First observedv0.1.0

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive, so the safety bar is lower; the description adds useful scope constraints (no coordinates, no belt routing) and the tier-consistency guarantee. However, the schema exposes a 'save' parameter while readOnlyHint=true, and the description never clarifies whether saving writes state — a gap an agent would want resolved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core purpose and with zero filler. The second sentence is grammatically dangling ('is solved with, so schematic and plan agree'), which costs a point on clarity without costing much length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with no output schema, the description should at least characterize the response shape, and it only gestures at it via the list of schematic categories. Combined with the unexplained 'save' parameter, there are real gaps, though the stated scope boundaries prevent the agent from misusing it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the baseline is 3. The description hints at the belt_tier/pipe_tier behavior ('solved with, so schematic and plan agree') and the space-budget concept behind max_floor_foundations, but it adds no semantics for plan, save, as_of, show, or order_floors_by beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The phrase 'Plan to schematic' plus the enumeration of outputs (blocks, buses, floors, materials, space budget) tells an agent this renders a saved plan into a schematic view, and it explicitly names the boundary against site_plan. It falls short of a crisp verb+resource statement and never says what 'schematic' actually is, so an agent still has to infer the output form.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is one real exclusion: 'no coordinates or belt routing (site_plan places it)' routes the agent to the right sibling for placement. But there is no positive when-to-use guidance, and no differentiation against plan_factory, edit_plan, plans, or factory_floors, several of which could plausibly be confused with this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.