SatisfactoryMCP
SatisfactoryMCP is a local MCP server that reads Satisfactory saves and helps Claude analyze factories, plan production, rank upgrades, and show results on a map.
Read worlds/saves: list worlds, summarize progress/power/problems, inspect phases, research, inventory, crates, boosters, and collectibles.
Analyze factories: name/propose/select factories, view floors, query recipes/buildings/power/links/issues, diagnose stopped machines, trace feeds, and inspect belts/pipes.
Diagnose health: find blocked/starved/stalled/paused machines, missing power, fluid/head-lift/plumbing faults, and full-storage vs real blockages.
Plan production: solve LP/MILP plans over unlocked recipes for target rates or power, with machines, clocks, raw inputs, byproducts, exports, power, layout, commissioning waves, and save diffs.
Optimize choices: bill of materials, recipe-route comparisons, byproduct explanations, hard-drive/unlock ranking, and build-site ranking.
Query game data: search items/recipes/buildings, recipe details, alternates, unlocked recipes, resource nodes, regions, and locations.
Work spatially: show map links, describe coordinates/regions/terrain, find nearby conduits/resources/sites, and pin locations.
Manage project state: edit factory names/storage stance, save/version/share/import plans, record plan sitings, and change shared settings/UI context.
Stay save-safe: game saves are only read; edits affect SatisfactoryMCP metadata (factory labels, plans, settings, pins), not the save file.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SatisfactoryMCPplan a factory for 10 turbo motors per minute using my save"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SatisfactoryMCP
Ask Claude about a Satisfactory factory. SatisfactoryMCP is an MCP server that reads the save files on this PC and answers in chat: what runs, what stands still and why, what to build next and how, planned with a real optimizer over the game's own recipe data and the recipes the world has unlocked. A local web page draws the same world on a map. Everything runs on the player's PC and only ever reads saves.
An unofficial fan tool for Satisfactory. Not affiliated with or endorsed by Coffee Stain Studios. Satisfactory and game assets © Coffee Stain Studios AB.
Ask Claude about the factory
Phrased however the player likes; Claude picks the tools. Four questions and what comes back:
How healthy is the steel factory? Anything blocked or starved?
factory_health lists the machines that need action, grouped by state and cause, and tells a
line backed up into full storage (stock done) from a real blockage: a torn belt, a feed that
brings the wrong item, an output that leads nowhere.
Plan 20 Modular Frames a minute with what I have unlocked. What do I build?
plan_factory solves over the unlocked recipes and answers with the buildings per recipe at
their clocks, the raw inputs, the power drawn and the belt or pipe each flow needs, warnings
first: a whole machine for a sliver of a rate, unused Somersloops, a byproduct with no outlet.
A setup that would strand a byproduct is reported infeasible, not overstated. The plan's handle
goes on to plan_layout, commission_plan and diff_vs_save.
Which hard drive should I open first?
hard_drives ranks the unclaimed drives by what each alternate would save against the goals
and saved plans: machines and power off the bill, and need against supply.
Show the coal power plant on the map.
show_on_map answers with a link into the local map, centred on it.
Every answer names the save it read and how old it is. All 49 tools, the prompts and the resources: docs/mcp-surface.md.
Related MCP server: minecraft-diagnostic-mcp
Quick start
Needs Python ≥ 3.11 with uv, and a local Satisfactory install (Steam or Epic): recipes and rates come from the game's own data dump, so they stay right when the game patches. Node.js only builds the page. Developed and tested on Windows, where saves and the install are found on their own; elsewhere, set their paths (configuration).
Chat
git clone https://github.com/lukszi/SatisfactoryMCP.git
cd SatisfactoryMCP
uv syncRegister it in Claude Code, at user scope so it loads in any directory:
claude mcp add --scope user satisfactory -- uv run --directory "/path/to/SatisfactoryMCP" satisfactory-mcpClaude Desktop (claude_desktop_config.json) and other stdio clients:
{
"mcpServers": {
"satisfactory": {
"command": "uv",
"args": ["run", "--directory", "/path/to/SatisfactoryMCP", "satisfactory-mcp"]
}
}
}Then open a new chat and ask. satisfactory-mcp finds the local server or starts one, so every
chat and the page share one process, which ends itself after 10 minutes unused. Its commands
(stop, start, restart, status): docs/hosted-seams.md.
Updating: docs/releasing.md; from 0.2:
docs/upgrading-to-0.3.md.
The page
Build the page once, or unzip a release's static.zip into
packages/satisfactory-web/src/satisfactory_web/static/; then cut the item and building icons
from the installed game (again after a game update):
cd packages/satisfactory-web/src/satisfactory_web/frontend
npm ci && npm run build
cd -
uv run --extra gen python tools/gen_item_icons.pyThe page is at http://127.0.0.1:8712, served by the same process: the first chat starts it,
or uv run satisfactory-mcp-web. It binds to localhost on purpose, because the API answers with
the contents of the save folder and has no authentication. Base maps are made on its map studio
(#maps), which names any setup still missing.
A page served elsewhere: the helper
The page also builds to run in the browser with no server
(docs/hosted-seams.md). Served from a site or from this
PC, it reaches the saves through sf-companion, the helper on the player's PC, which also
serves the tools to a chat:
uv run --package sf-companion sf-companion serve --server https://<site>
claude mcp add --scope user sf-companion -- uv run --directory "/path/to/SatisfactoryMCP" --package sf-companion sf-companion mcp --server https://<site>For a page served from this PC, pass --origin http://127.0.0.1:<port> instead of --server.
sf-companion import-local brings the local app's factory names and plans over, and
sf-companion claude-command prints the Claude Code command line that loads the game channel,
for requests typed in the game (a preview). Every command, and installing the helper from a
release without a clone: docs/companion.md.
What it can do
Read the world: power circuits in the game's terms, factories found and named from the save, machine health with causes, fluid head lift, inventory and crates, phases, research, hard drives, Power Shards and Somersloops.
Plan: an LP/MILP optimizer over the game's recipes and the world's unlocks, byproducts balanced, with layouts, commissioning against the save, unlock ranking and build sites; saved plans keep their history and share as links, text or files (docs/planning.md).
Show it: a page with the map, factories, power, progress, items, world and planner, following the saves live as the game writes them.
Answer in the game: the helper's game channel passes requests from an in-game mod to a running Claude Code session and the answer back (docs/companion.md).
The map
Factories, belts, pipes, power and resource nodes drawn over a base map: the game's own artwork, or a satellite, relief or terrain map rendered from the game's data by the map generators (tools/mapgen/README.md), lit by a live sun.

|
|
Docs and packages
Document | Covers |
the design spine and the index of every spec document | |
every tool, prompt and resource | |
the optimizer, layout and unlock ranking | |
coordinates, regions, selectors and the map | |
the one process, the shim, map links, the stores, the browser runtime | |
the helper: commands, install, the game channel | |
development setup, tests, architecture rules | |
versions, branches, updating, releases | |
what changed, with upgrade notes |
One uv workspace, nine wheels at one version; each package's README says how to use it alone:
Package | Holds |
the save parser, standard library only | |
readers for the game's asset container, for the map and data generators | |
game data, saves, the domain and planner, the JSON API as plain calls | |
the MCP tools, the stdio server, the shim | |
the web API and the page | |
| the one process, its lifecycle, the console scripts |
the helper on the player's PC | |
the helper's records file and edits API | |
a packed save projection's metadata |
Licence
PolyForm Shield 1.0.0. Free for any use except providing a product, paid or free, that competes with this software or with any product the licensor provides using it. Copies must carry the licence terms (or their URL) and the required notice:
Required Notice: Copyright Lukas Szimtenings (https://github.com/lukszi/SatisfactoryMCP)
Licensor Line of Business: Satisfactory save analysis, factory planning and map software and hosted services (https://github.com/lukszi/SatisfactoryMCP)
A competing product needs a separate licence from the licensor — get in touch via GitHub (@lukszi). The licence covers this repository's code, tooling and extracted tables; it cannot and does not grant anyone rights over the game's content, which Coffee Stain Studios retains. The page bundles Leaflet (BSD-2-Clause) at build time, with its licence text beside every build.
Contributions are accepted under the CLA; the steps are in CONTRIBUTING.md.
Available Tools
49 toolsalternates_for_itemBRead-onlyIdempotent
Every recipe that makes an item, alternates first, marked HAVE/LOCKED against the save.
A LOCKED row names the schematic that grants it. With plan: each recipe's status in
that plan and the machine, MW and raw-input deltas of requiring it.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| plan | No | a saved plan: add what requiring each recipe would change in it | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| include_locked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world, so the safety profile is free. The description adds genuine behavioral detail — LOCKED rows name the granting schematic, and the plan mode returns per-recipe status plus machine/MW/raw-input deltas — but says nothing about result size, ordering guarantees, or what happens when the item is unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and only two short paragraphs, no filler. Slightly harmed by telegraphic phrasing ('alternates first, marked HAVE/LOCKED against the save') that costs a re-read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six parameters with no output schema and four undocumented fields; the description does not explain what a row actually contains, how `save`/`as_of`/`world` interact, or what `include_locked=false` hides. For a tool whose whole value is the shape of its rows, that is a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only `plan` and `as_of` are documented). The description partially compensates by explaining plan-mode deltas and the save-relative HAVE/LOCKED marking, but `world`, `save` vs `as_of` distinction, and especially `include_locked` (default true) are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: it enumerates every recipe that produces a given item, ordered alternates-first, with HAVE/LOCKED flags. That distinguishes it from recipe_detail or search_recipes, though the HAVE/LOCKED vocabulary is domain jargon used without definition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains what happens if you pass `plan`, but never says when to choose this over nearby siblings such as compare_recipe_options, recipe_detail, or trace_upstream. No exclusions or preconditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bomBRead-onlyIdempotent
Flattened bill of materials for qty/min of an item: raw and intermediate rates, chosen recipe and machines per row.
qty is a rate per minute. Solved by LP, not tree expansion (recipe cycles have no safe depth), so each row names its recipe; alternates change the totals.
| Name | Required | Description | Default |
|---|---|---|---|
| qty | No | ||
| item | Yes | ||
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| outlets | No | byproducts allowed out as products instead of sunk | |
| allow_sinks | No | ||
| only_recipes | No | ||
| exclude_recipes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, idempotent, read-only operation. The description adds substantive behavioral context beyond the annotations: qty is interpreted as a rate per minute, the result is LP-solved rather than tree-expanded because recipe cycles lack a safe depth, and each row names its chosen recipe. It does not cover pagination, save pinning, or output shape, but it meaningfully improves understanding of the computation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core output, and the second explains the important qty and LP-solving semantics. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 11-parameter planning tool with no output schema and very low schema description coverage. The description covers the central BOM concept and qty semantics but omits most parameter behavior and does not describe return structure, pagination, save pinning, or outlet/sink handling. It is not complete enough for reliable invocation across all provided parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 18% across 11 parameters, so the description needs to compensate but does not. It explains that qty is a rate per minute and that the calculation is for an item, but it leaves save/as_of, world, limit/offset, outlets, allow_sinks, only_recipes, and exclude_recipes unexplained. The note that alternates change totals hints at recipe selection but does not document the filtering parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource clearly: a flattened bill of materials for an item at a given qty/min, including raw and intermediate rates, chosen recipes, and machines per row. It also distinguishes the LP-based approach from tree expansion. It does not explicitly name a sibling alternative, but the purpose is still clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that the tool is used to calculate a bill of materials for an item at a rate per minute. However, it gives no explicit when-to-use guidance, no exclusions, and no comparison to relevant siblings such as trace_upstream, recipe_detail, compare_recipe_options, or plan_factory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boostersARead-onlyIdempotent
Power Shards or Somersloops: free, committed and owned, and which machines hold them.
kind=shards also says whether plan_machines at plan_clock fit the free shards, or
the ones craftable from slugs in hand.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | shards | somersloops | shards |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| plan_clock | No | shards: the clock they would run at | |
| plan_machines | No | shards: machines an overclock plan would run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and non-open-world behavior, so the bar is lower. The description adds genuine context: it reports ownership/commitment state plus machine holders, and discloses a conditional mode where kind=shards performs a fit-check against free or slug-craftable shards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler; the core output scope is front-loaded and the conditional shards behavior follows. The phrasing 'free, committed and owned' is slightly compressed, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With eight parameters, no output schema and only 50% schema description coverage, the description should do more: it never explains pagination (limit/offset), save/world scoping, or the shape of returned data. It covers the interesting subset (kind and plan parameters) but leaves the rest underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, yet the description clarifies just three of the eight parameters (kind, plan_machines, plan_clock) and their interaction. The save, as_of, world, limit and offset parameters are left entirely to the schema, so the description does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (Power Shards / Somersloops) and the information returned (free, committed, owned, and which machines hold them), which is more specific than the opaque tool name 'boosters'. It doesn't explicitly contrast with a sibling tool, but the enumerated output scope makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: setting kind=shards unlocks an overclock-planning check via plan_machines/plan_clock, which hints at when this tool is relevant. There is no explicit statement of when to prefer this over siblings like inventory or hard_drives, nor any exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collected_from_worldARead-onlyIdempotent
Map collectibles (slugs, sloops, spheres, mushrooms, drop pods): how many exist, taken, left, closest.
Existence is read from the installed game's map data, removal from the save's destroyed-actor list; remaining is the difference. show=census counts per category; collected and remaining list placements with coordinates; nearest lists remaining by distance from near=. A placement this save never loaded counts as remaining, flagged never_streamed.
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | 'x,y' (m), 'me' or a factory; @<radius_m> keeps what is within; nearest defaults to you | |
| save | No | ||
| show | No | census | collected | remaining | nearest | census |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| group | No | one category, e.g. 'power_slug_blue'; omit for all | |
| limit | No | ||
| world | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent profile, and the description adds genuinely new behavioral context: existence comes from installed map data, removal from the save's destroyed-actor list, remaining is the difference, and never-loaded placements are counted as remaining and flagged never_streamed. It omits pagination behavior (limit capped at 25, offset) and the meaning of save/as_of/world for staleness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and the counts before the mechanism, then mode descriptions. Dense and mostly waste-free, though the trailing provenance sentence is slightly buried and a stray blank line breaks the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches what each show mode returns (per-category counts, coordinate listings, distance ordering). For an 8-parameter tool with 50% schema coverage, the unaddressed save/world/as_of/pagination semantics are the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so the description must carry weight. It explains show modes, the near= syntax and the group category concept, but save, as_of, world, limit, and offset receive no explanation anywhere in the description, leaving several parameters semantically thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb and resource — 'Map collectibles (slugs, sloops, spheres, mushrooms, drop pods)' — and immediately states the four quantities returned (exist, taken, left, closest). None of the siblings (show_on_map, world_summary, search_resource_nodes) touch save-state collectible accounting, so the tool is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The show= enumeration (census | collected | remaining | nearest) is described functionally, so an agent can pick a mode from intent. It stops short of explicit 'when not to use this' or naming an alternative sibling for related map questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commission_planARead-onlyIdempotent
Startup order for a built plant: which blocks to energise in which wave without blowing the fuse.
Not a build order: build everything first, then energise wave by wave. A wave's consumer draw must fit in headroom plus the output of generators already burning, or the fuse blows and stops the whole grid until reset by hand. Generators energise free and pay for the next wave.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | Yes | a saved plan's name or pin:N, or the solve: handle plan_factory printed | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| biomass | No | count hand-fed biomass burners as generation; omitted: the shared setting | |
| headroom_mw | No | grid power free for startup; default reads it from the save |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/idempotentHint annotations by explaining the underlying mechanic: a wave must fit headroom plus running generator output, or 'the fuse blows and stops the whole grid until reset by hand.' That consequence framing is genuinely useful context even though the tool itself is a safe read. It stops short of saying what the tool returns or that computing costs nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core statement in the first sentence, and every subsequent sentence adds domain meaning rather than filler. The hard line wrapping makes it slightly harder to scan than it needs to be, but there is no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the domain model (waves, headroom, fuse) well for a complex 8-parameter tool, and annotations already assure it is non-destructive. However, with no output schema and no statement of what the returned plan looks like or whether it is paginated (limit/offset), an agent still lacks a picture of the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% and 8 parameters exist; the description names no parameters at all, so plan/save/as_of/limit/world/offset rely entirely on schema text (and several have none). It indirectly illuminates headroom_mw by explaining the headroom concept ('headroom plus the output of generators already burning'), which is real added meaning, but not enough to compensate for the undocumented half.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Startup order for a built plant: which blocks to energise in which wave.' It explicitly distinguishes itself from a build order, which separates it from build-oriented siblings like site_plan and plan_factory, though it never names a sibling directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Not a build order: build everything first, then energise wave by wave' clearly states the precondition and when this tool applies. It gives a strong usage condition but never names an alternative tool (e.g. plan_factory, site_plan) for the build-order case, leaving the routing implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_recipe_optionsARead-onlyIdempotent
Rank whole routes to make an item by cost: raw per unit, buildings, net power, byproducts needing an outlet.
Each route is solved end to end (Crude -> Alt HOR -> Diluted Fuel against Crude -> Fuel); alternates_for_item only lists recipes.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| rate | No | ||
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| outlets | No | byproducts allowed out as products instead of sunk | |
| allow_sinks | No | ||
| per_resource | No | raw resource to price per unit in; omit = the one the routes share |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, idempotent, closed-world query, so the description's job is narrower. It adds real behavioral context: each route is solved end to end (with a worked example chain) and the ranking incorporates raw cost, buildings, net power, and byproducts. It does not disclose output shape, truncation via `limit`, or ranking tie-breaks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences with no filler; the ranking criteria come first and the sibling contrast closes it. The 'Crude -> Alt HOR -> Diluted Fuel' example is dense domain jargon but earns its place by illustrating the end-to-end solving behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema the description must convey what comes back, and it only implies a ranked list. For a 9-parameter tool at 33% schema coverage, it leaves save/world/as_of scoping, `rate`, `allow_sinks`, and ranking output shape unexplained, so it is minimum-viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, so the description must carry the burden, yet it only gestures at concepts already documented in the schema (`per_resource` as 'raw per unit', `outlets` as 'byproducts allowed out'). It says nothing about the undocumented parameters `rate`, `save`, `world`, `allow_sinks`, or `limit`, leaving most inputs ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rank whole routes to make an item by cost') and enumerates the cost dimensions ranked (raw per unit, buildings, net power, byproducts). It also explicitly distinguishes itself from the sibling `alternates_for_item`, which 'only lists recipes', so the agent can separate the two without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context (full end-to-end route comparison with cost ranking) and names the alternative tool `alternates_for_item` plus the condition that separates them. There is no explicit statement of when this tool is inappropriate (e.g. single-item lookup vs multi-route comparison), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cratesBRead-onlyIdempotent
Crates on the ground (death and dismantle crates): contents and where to walk to.
Recoverable, never spendable stock.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds the useful semantic distinction that crate contents are recoverable rather than spendable, but says nothing about pagination behavior or how the location data is presented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short lines with the resource definition front-loaded and no filler. The parenthetical is efficient, though 'where to walk to' is colloquial enough to need a beat of interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with 20% schema coverage and no output schema, the description is too thin — an agent cannot tell what save vs world do, how results are paged, or what a crate record contains beyond a vague 'where to walk to'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% — only as_of is documented. With five parameters (save, as_of, limit, world, offset), the description gives no guidance on what save/world mean, the 25-item cap, or pagination via offset, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (crates on the ground, including death and dismantle crates) and what it returns (contents plus where to walk). That distinguishes it from inventory and collected_from_world, though the verb itself is only implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Recoverable, never spendable stock' implies the use case — recovering items lost to death or dismantling — but there is no explicit when-to-use, when-not, or named alternative among the many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_locationARead-onlyIdempotent
What is at a place: region, terrain height, sampled elevations, belts and pipes through it, nearest node and field.
terrain_m is the terrain field's reading at the point (water surface and depth where it stands); ground and built elevations are sampled from nodes and buildings within radius_m, never averaged, and their gap is fill already stacked. Conduit counts read the save: zero means nothing runs through; search_conduits lists them.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | the place: 'x,y' in metres, 'me', a factory or region name, 'node:<id>', 'slab:<n>', 'chain:<n>'/'pipe:<n>' | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| radius_m | No | how far to look for known elevations, metres |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low; the description still adds real behavioural substance — terrain_m is a point reading including water surface/depth, ground and built elevations are sampled from nodes and buildings within radius_m and never averaged, and conduit counts come from the save (zero means none). What's missing is any statement about cost/latency or what happens when the point is outside known data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output inventory is front-loaded in sentence one and the remaining two sentences carry distinct semantics (elevation sampling, conduit counts). It is dense to the point of being cryptic in places — 'their gap is fill already stacked' requires domain knowledge — but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the job of describing returns and does so thoroughly (region, terrain, elevations, conduits, nearest node/field). Five optional parameters at 60% coverage leave 'save' and 'world' opaque, and there's no note on behaviour at unknown/empty locations, but the core contract is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates by explaining what radius_m actually does (defines the sampling window for node/building elevations) and by clarifying that conduit results are save-derived counts. The 'at' and 'as_of' parameters are well documented in the schema itself, but 'save' and 'world' remain unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence enumerates exactly what the tool reports at a location (region, terrain height, sampled elevations, conduits, nearest node/field), which is far more specific than the name alone. It also implicitly separates itself from search_conduits by pointing there for the full list. It lacks an explicit verb framing ('describe/report') and doesn't contrast against near-neighbours like whereami or search_resource_nodes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the reader infers this is the 'inspect one spot' tool from the enumerated outputs, and one alternative (search_conduits) is named for the case where you need conduit listings rather than counts. There is no explicit when-to-use/when-not, and no guidance versus whereami, factory_map, or search_resource_nodes, which overlap in scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_vs_saveARead-onlyIdempotent
Steps from the factory as built to a plan: UNPAUSE, SETRECIPE, then BUILD, with the power the new machines add.
Re-solves the plan. Machines match by identity (building + recipe; generators by building; extractors by node), never by position; one on another recipe is busy. Water Extractors cannot be identified, so their count is a range. A saved plan's diff is grouped by startup stage (commission_plan's partition): stage=n narrows to one, stage=0 shows the stage overview of an unsaved solve. Power is proven one way only: a machine that produced in its last 300 s had power; one that did not is 'nothing proven running', never 'unpowered'. Read-only, no dismantle action: machines on the plan's ground but not in it are listed for you to judge.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | Yes | a saved plan's name or pin:N, or the solve: handle plan_factory printed | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| stage | No | one startup stage's delta; 0 for the stage overview | |
| world | No | ||
| biomass | No | count hand-fed biomass burners as generation; omitted: the shared setting | |
| factory | No | count only this factory's machines as built; also 'auto', 'world' or 'none' | |
| show_cost | No | include the bill of what is left to build against spendable stock |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only and non-destructive; the description adds genuinely new behavior: identity-based matching by building+recipe, generators by building, extractors by node, 'busy' machines, the water-extractor count range, and the one-directional power proof rule ('nothing proven running', never 'unpowered'). It also discloses that unmatched in-ground machines are listed rather than removed. It stops short of describing the response shape or any limit behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core transformation and has no filler, but it adopts a compressed, jargon-heavy style ('one on another recipe is busy', 'nothing proven running') that packs several distinct rules into single lines. The density makes it slower to parse than an organized bullet-style breakdown of matching rules, stage semantics, and power rules would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, no-output-schema read-only analysis tool, the description covers the semantically hard parts: matching identity, range-based extractor counts, stage partitioning, the power caveat, and the billing output ('show_cost'). The main gap is that the shape of the return (per-stage deltas, machine lists, bill) is only sketched, and five of the nine parameters receive no narrative treatment.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the description bears partial load. It meaningfully clarifies `plan` (name, pin:N, or solve: handle) and `stage` (one stage vs. stage overview) — semantics the schema only partly carries. But it says nothing about `limit`, `as_of`, `world`, `factory`, or `biomass` beyond what the schema already states, leaving a gap that matches the mid-tier coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a concrete transformation: from the factory as built to a plan, expressed as concrete actions (UNPAUSE, SETRECIPE, BUILD) plus the power delta. This clearly separates it from plan-making siblings such as plan_factory, though it does not directly name the sibling it displaces for a given question. Purpose is specific and distinguishable, but the agent must infer the boundary with commission_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It hints at usage through 'stage=n narrows to one, stage=0 shows the stage overview of an unsaved solve' and by noting plan can be a solve: handle printed by plan_factory. However, there is no explicit 'use this when…, use X instead' statement for the many adjacent tools (plan_factory, commission_plan, bom, factory_map). Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_factoryADestructive
Name, amend, rename or forget a named factory (a set of machine ids), or set its storage stance.
Ids survive moves and autosaves. name on an existing name replaces its machines. amend adds, drops, then prune_missing clears gone anchors; one machine is machine:; the last can't be dropped. rename: saved plans follow. forget keeps the machines. storage: is full storage at a line's end stock or a blockage. dry_run previews.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | rename: new name; storage: stockpile|flow|default | |
| add | No | amend: selector terms to add | |
| drop | No | amend: selector terms to drop | |
| name | Yes | ||
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| notes | No | ||
| split | No | name: keep only the largest spatial cluster | |
| world | No | ||
| action | Yes | name | amend | rename | forget | storage | |
| expand | No | name: pull in everything belted to the result | |
| select | No | name: selector terms: product:<item> | recipe:<name> | building:<name or class> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | pin:<n> | all. Terms are ANDed; commas inside one term OR; a leading '-' excludes | |
| dry_run | No | ||
| prune_missing | No | amend: drop every anchor this save no longer has |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds real disclosure beyond them: overwriting an existing name replaces its machines, forget keeps the machines, rename propagates to saved plans, and dry_run previews before committing. Those are exactly the consequences an agent needs before invoking a destructive tool. It omits any mention of permissions, confirmation requirements, or what dry_run actually returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly ninety words for a 14-parameter, five-action tool is efficiently sized, and the action inventory is front-loaded in the first sentence. The telegraphic fragment style ('storage: is full storage at a line's end stock or a blockage') is dense to the point of being cryptic, and 'Ids survive moves and autosaves' sits awkwardly between action definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 14-param tool with no output schema, the description covers the five actions and the highest-risk parameters but leaves save, world, and notes unexplained, and never says what a dry_run preview produces. An agent can pick the right action but would still be guessing about scope parameters and return shape. Adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 64% schema coverage across 14 params, the description adds meaningful semantics the schema lacks: the ordering of add → drop → prune_missing, the 'machine:<instance>' anchor form and the rule that the last machine can't be dropped, and the interpretation of 'to' for the storage action. It does not explain save, world, or notes, and does not clarify dry_run's effect per action, leaving a meaningful remainder undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific multi-verb statement naming the resource and its scope: 'Name, amend, rename or forget a named factory (a set of machine ids), or set its storage stance.' An agent immediately knows this is the mutation surface for factory groupings, as opposed to read siblings like list_factories or factory_query. It stops short of naming a sibling explicitly, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives good per-action selection guidance internally ('name on an existing name replaces its machines', 'amend adds, drops, then prune_missing clears gone anchors', 'rename: saved plans follow'), which is genuinely useful for choosing among the five actions. However, it never states when to reach for edit_factory versus edit_plan, plan_factory, or plan_from_factory, and gives no prerequisites or when-not-to-use conditions. Usage is implied through action semantics rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_planADestructive
Rename, forget, undo or restore a saved plan; each edit is a new version and needs base_rev. Nothing is re-solved.
rename keeps key, siting and notes; forget deletes it (undoing that version brings it back); undo writes the inverse of version=; restore makes the head equal version= again.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | rename: the new name | |
| name | Yes | ||
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| action | Yes | rename | forget | undo | restore | |
| version | No | undo: the version to reverse; restore: to return to | |
| base_rev | No | the plan version you read; needed to change an existing plan |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, and the description adds real value on top: every edit creates a new version, base_rev is required to change an existing plan, forget is reversible via undo, and plans are never re-solved. It omits what happens on a stale base_rev (conflict behavior) and any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a compact four-action definition list; the versioning/base_rev constraint is front-loaded before the per-action detail. No filler, though the multi-line action glossary is slightly denser than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, versioned mutation with annotations present and no output schema, the description covers the semantics an agent needs to call it safely: versioning model, base_rev requirement, reversibility of forget, and no re-solve side effects. Minor incompleteness remains around the unexplained optional selectors (save/as_of/world).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63% and the description reinforces the meaning of version= (inverse for undo, target for restore) and the base_rev concurrency requirement. However, save, as_of, world and the required name parameter get no explanation in either place, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb set (rename, forget, undo, restore) and the resource (a saved plan), and adds the crucial scope statement 'Nothing is re-solved,' which separates it from re-solving siblings like site_plan or plan_factory. It stops short of naming an explicit sibling alternative, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives per-action semantics — rename keeps key/siting/notes, forget deletes (recoverable by undoing that version), undo inverts version=, restore sets head to version= — which is effectively when-to-use guidance for each mode. It does not say when not to use it or point at siblings such as diff_vs_save for inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_byproductsBRead-onlyIdempotent
Which byproduct stalls a plan (INFEASIBLE) and what can consume it: sink (solids only) or recipes, unlocked vs locked.
Item balances are equalities, so an unconsumed byproduct makes the solve infeasible; a fluid must be consumed or packaged first. Reads an infeasible solve: handle too.
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | one byproduct to focus on; omit = the whole plan | |
| plan | Yes | a saved plan's name or pin:N, or the solve: handle plan_factory printed | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a safe, read-only, idempotent operation. The description adds valuable domain behavior: item balances are equalities, unconsumed byproducts cause infeasibility, and fluids must be consumed or packaged first. Return format and pagination behavior are not described, but the domain context is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the domain rationale is compact. The phrase 'handle too' is slightly cryptic, but overall the description is efficient and avoids unnecessary length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter diagnostic tool with no output schema, the description explains the core return concept well: which byproduct stalls the plan and what can consume it. However, it leaves several parameters and full output details unspecified, so it is adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description does not explain the undocumented parameters such as save, limit, or world. It reinforces the concept of focusing on a byproduct or the whole plan, but does not fully compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool identifies which byproduct makes a plan infeasible and what can consume it, including sinks and recipes. It is specific enough to separate this diagnostic tool from plan-building siblings, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Reads an infeasible solve: handle too' gives implied context for when to use it, but there is no explicit when-not guidance or named alternative tool. Usage is inferable but not fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factory_floorsARead-onlyIdempotent
Floors of a foundation platform: how many decks and what stands on each.
Floors are recovered from geometry (clustered foundation tops, no assumed pitch); a band under a quarter of the largest deck is marked minor (mezzanine or plinth). Default: one row per platform, largest first. platform= (index stable on one save) or factory= narrows to one platform, answered floor by floor.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| factory | No | a factory name or one selector term | |
| platform | No | one platform by the index this tool prints |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, and the description adds genuinely useful method disclosure beyond them: floors are recovered by clustering foundation tops with no assumed pitch, sub-quarter-size decks are flagged minor, and platform indices are only stable within one save. That last caveat is exactly the kind of behavioral trap worth surfacing. It stops short of describing response payload or how pagination interacts with the index stability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler, leading with what the tool returns and then the default behavior and narrowing options. Slightly terse given the number of undiscussed parameters, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, the description defines the domain-specific semantics (floors, minor decks, platform index) well but says nothing about what save/world/limit/offset control, and does not describe the row shape beyond "one row per platform." Adequate, with clear gaps the agent must resolve from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 43% schema coverage across 7 parameters, the description fills real gaps: it explains platform= as the index this tool prints, adds the stability caveat, and defines factory= as a name or single selector term. save, world, limit and offset are left entirely to the schema, which is where the coverage gap sits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Floors of a foundation platform: how many decks and what stands on each" names the resource and the exact question it answers (deck count + contents per deck), which distinguishes it from factory_map, site_plan and factory_query. The verb is implicit and the phrasing is jargon-heavy, but the intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the default shape (one row per platform, largest first) and two narrowing modes (platform= for one index, factory= for one platform answered floor by floor), which implies when to reach for it. It never names a sibling alternative or an explicit when-not condition, so the agent must infer when to prefer this over factory_map or site_plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factory_healthARead-onlyIdempotent
Why machines are stopped: measured uptime per machine and each stopped one's cause; 'all' sweeps.
Uptime: share of the save's 300 s productivity window spent producing. States, worst first: paused, dead node (extractor on no resource), no recipe, blocked (output full), starved (input short), stalled (input and room, still not running), intermittent, saturated, unmonitored; todo counts the first five. A machine no generator reaches over the wires says so (no wire, or a circuit with no generator); a reachable one is never called unpowered. A starved machine names its missing input's feeder one hop back (the run, its far end, that feeder's state); trace_upstream walks further. A missing fluid is diagnosed on the plumbing ladder: connection, head lift, flow rate; the first failing rung is the cause. factory='all' adds world-wide plumbing faults: fluid buffers too low to output at intake rate, unwired pipeline pumps, lines above head lift. offset pages every table at once.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| factory | No | a factory name, one selector term, or 'all' for every named factory | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe read-only, idempotent operation, and the description goes well beyond that: it defines uptime against the 300 s productivity window, enumerates the state taxonomy worst-first, explains the fluid diagnosis ladder, and describes offset paging across all tables. It does not mention cost, latency, or how 'save' vs 'as_of' select a world, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line, but the remainder is a dense block of domain jargon with no bullets or grouping, making the state taxonomy and fluid ladder slow to parse. Little text is wasted, yet the presentation is hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so thoroughly: uptime meaning, state ordering, starvation back-tracking, and fluid diagnosis rung. It is weaker on parameter-level completeness and on how save/as_of pin a snapshot, leaving some agent-facing questions open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 33% schema coverage across 6 parameters, the description must compensate. It meaningfully explains factory ('a name, a selector term, or all') and offset ('pages every table at once') but leaves save, world, and limit unexplained, and does not clarify when to use 'as_of' versus 'save'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause names a specific verb and resource: measuring uptime per machine and attributing each stopped machine's cause. That distinguishes it from siblings like power_report or factory_query. It never explicitly contrasts its own scope with those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It hints at routing ('factory=all sweeps', 'trace_upstream walks further') but never states when to pick this tool over factory_query, power_report, or trace_upstream. Usage context is implied by the described outputs rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factory_mapARead-onlyIdempotent
Raw factory signals: power islands (base:), belt components (line:), foundation slabs (slab:).
Also the named factories. Islands merge a grown-together base, belt components fragment it, slabs are sharpest but miss ground-built machines; propose_factories combines them. Where they disagree, carve with edit_factory and a product:, near: or slab: term. show=slabs also lists bare platforms (foundations with no machine) with tile count, extent and elevation.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| show | No | candidates | named | slabs | unlabelled | all | all |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real substance: islands over-merge grown-together bases, belt components fragment, slabs are sharpest but miss ground-built machines, and show=slabs returns tile count, extent and elevation. That is meaningful disclosure about data quality and return shape beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, signal definitions front-loaded before the comparison guidance and the show=slabs detail. Dense jargon, but every clause carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-output-schema tool the conceptual model is well conveyed, but half the parameters are unexplained and the description never indicates what the result looks like (e.g. how signals are grouped or paginated by limit/offset). Adequate, with clear gaps remaining.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% across 6 parameters, so the description must compensate. It does explain show's slabs mode and implicitly maps candidates to the three signal types and named to named factories, but save, world, limit and offset are left entirely to the (sparse) schema. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete signals returned (power islands base:<n>, belt components line:<n>, foundation slabs slab:<n>) plus named factories, which is far more specific than the tool name alone. It implicitly distinguishes itself from propose_factories by framing itself as the raw-signal source rather than the synthesizer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: propose_factories combines the signals, and when sources disagree you carve with edit_factory using a product:, near: or slab: term. It also flags a specific mode (show=slabs lists bare platforms). It does not cover when to prefer list_factories or factory_query, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factory_queryBRead-onlyIdempotent
One question about one factory: what it makes, needs, draws or touches; show= takes several views.
Every rate is nameplate (at the saved clock) and measured (scaled by each machine's 300 s productivity window, so an idle line measures 0 without being broken); unmonitored machines are shown apart. offset pages every table at once.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| show | No | comma-separated: summary (size, position, top recipes, net power) | machines (building, recipe, clock) | recipes | buildings | balance (per item produced, consumed, net) | inputs (net deficit, fed from outside) | outputs (net surplus) | internal (made and eaten inside) | power (draw vs generation) | nodes (under its extractors) | links (material exchanged with other factories) | issues (paused, recipe-less, unresolved) | summary |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| factory | Yes | a factory name or one selector term, e.g. proposal:3 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description goes meaningfully beyond them: it explains nameplate vs. measured rates, the 300 s productivity window that makes an idle line read zero legitimately, that unmonitored machines are reported separately, and that offset paginates all tables jointly. That is exactly the kind of semantics an agent needs to interpret results. It stops short of covering error behavior (unknown/ambiguous factory, invalid view) or anything about the untokenized parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight lines, front-loaded with purpose, with no filler sentences. The compression is aggressive to the point of near-crypticity ("what it makes, needs, draws or touches"), but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read tool with no output schema, the description adequately frames what the result means (rate semantics, unmonitored machines, cross-table paging). It leaves gaps on four of the seven parameters and on failure modes when the factory selector does not resolve, which matters given how many sibling tools could be confused with it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 43%, so the description needs to compensate for undocumented parameters — and it largely does not. It adds real meaning for `offset` (pages every table at once) and reinforces `show`, but `save`, `limit`, `world`, and the exact selector semantics of `factory` go unaddressed in the description while also lacking schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a concrete scope ("One question about one factory") and enumerates the questions it answers (makes, needs, draws, touches) plus the multi-view mechanism via `show=`. It is clear what the tool returns, but it does nothing to distinguish itself from siblings like factory_health, factory_floors, factory_map, or trace_upstream that also read a single factory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implicit: the agent is told `show=` takes several views and that views can be combined, which implies "prefer this over multiple calls." There is no when-to-use / when-not-to-use statement, no mention of how to find a factory name (e.g., list_factories) if `factory` is unknown, and no exclusion against sibling read tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factory_sitesCRead-onlyIdempotent
Built production buildings clustered by distance into sites, largest first, each with a near: selector.
The selector goes in as a select= term or as factory=; propose_factories groups by more than distance.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so safety is covered. The description adds the clustering behavior and 'largest first' ordering, which is useful, but says nothing about pagination, the effect of limit/offset, or what a caller gets back. It adds context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and the core behavior is front-loaded, but the second sentence mixes selector syntax and a sibling comparison in a way that's hard to parse without prior domain knowledge. Nothing is padded, though some wording (e.g., 'Built production buildings') is awkward rather than economical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five parameters at 20% schema coverage and no output schema, the description carries a heavy burden and doesn't meet it: save, world, limit, and offset go unexplained, and return shape beyond ordering is unstated. The selector guidance is helpful but disconnected from the actual input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% – just as_of is documented. The description explains select= and factory= selector syntax, but neither appears among the five actual parameters (save, as_of, limit, world, offset), so the only parameter detail offered doesn't map to the schema. The remaining four parameters receive no meaning from either source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the result shape (production buildings clustered by distance into sites, largest first) and names a sibling, propose_factories, that differs. However, it never uses an explicit verb such as 'list' or 'find', so the action itself is only implied. An agent can infer this is a retrieval tool but not with full confidence from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It notes that propose_factories groups by more than distance, which implicitly guides selection, and explains where a near: selector goes. It stops short of stating when-not to use this tool or what prerequisites exist, leaving the comparison to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hard_drivesBRead-onlyIdempotent
Unclaimed hard drives, each with its pick and why; drive=N details one drive.
Measured on this world: shortages, open goals, raw saved on what is built, grid MW.
sources= adds a build-out solve on those nodes, as plan_factory does.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| drive | No | one drive's options in detail; omit for every pick | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| sources | No | with drive=: node selectors (as search_resource_nodes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety burden is covered. The description adds useful content about what each entry reports (shortages, open goals, raw saved, grid MW) and that `sources=` triggers an additional solve 'as plan_factory does' — genuinely beyond the annotations. It still omits how the solve interacts with pagination or how expensive that call is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the primary resource stated first and the modifier behaviors immediately after. It earns most of its length, though the telegraphic fragments ('Measured on this world: shortages, open goals, raw saved on what is built, grid MW') are terse to the point of being hard to parse for an agent unfamiliar with the domain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no output schema, and only 43% schema coverage, the description needs to carry more. It leaves `save`, `world`, `limit`, and `offset` unexplained and never says what the response looks like or how pagination/default of 25 affects the 'unclaimed' claim. An agent can invoke it, but not confidently reason about the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 43%, so the description should compensate — and it only explains `drive` and `sources`, both of which already carry schema descriptions. The undocumented parameters (`save`, `world`, `limit`, `offset`) are left with no semantics anywhere; notably the interaction between `save` and `as_of` (pinning a save) is never clarified in the description even though `as_of` hints at it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The core purpose is discernible: enumerate unclaimed hard drives with a recommended pick and rationale, plus a detail mode via `drive=N`. However, no explicit verb is used ('Unclaimed hard drives' is a noun phrase), and the second paragraph stacks unrelated capabilities (shortage metrics, build-out solve) onto the description, blurring what the tool primarily does. It does name a sibling (`plan_factory`) for the solve behavior, which helps differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied only through parameter hints: 'drive=N details one drive' and 'sources= adds a build-out solve.' There is no explicit statement of when an agent should reach for this tool versus siblings like `rank_unlocks`, `plans`, or `propose_factories`, and no stated prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_planC
Import a shared plan (link, sfplan: line or file) as a new plan.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | the copy's name; the shared name if omitted | |
| save | No | ||
| text | Yes | a plan share link, a sfplan: line, or a .sfplan.json file's text | |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (not read-only, not destructive, not idempotent), so the bar is lower. The description adds that the result is a new plan (i.e., source is copied rather than mutated), but says nothing about duplicate-name handling, save/world interactions, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Compact and easy to parse, though correspondingly thin on required context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, non-idempotent tool with five parameters, no output schema, and two undocumented parameters (save, world), the description is too sparse. It doesn't tell the agent what the import returns, how save/world affect the copy, or what happens on name collisions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%. The description restates the input forms already documented for the text parameter ('link, sfplan: line or file'), adding no new detail. The save and world parameters have no schema description and are not explained in the description either.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Import) and resource (a shared plan), plus the supported input forms and the outcome (a new plan). It is clear enough to distinguish from share_plan, though it doesn't explicitly contrast with siblings like plans or plan_from_factory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives such as plans, share_plan, or plan_from_factory, nor any preconditions or exclusions. The only implied usage is 'when you have a shared plan to import.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inventoryARead-onlyIdempotent
What you own: per-item totals, or each container, crate and fluid buffer with place and fill (show=containers).
spendable = carried + storage + Dimensional Depot, the pool every cost check spends;
machine buffers and crates are shown apart, never added in. Fluids are m3. item=
narrows either view; near=, container_kind= and empty= are containers-only.
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | one item by name | |
| near | No | containers: centre 'x,y' in metres, 'me', or a factory name | |
| save | No | ||
| show | No | totals (per item) | containers (per container and crate) | totals |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| empty | No | containers: include empty ones | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| radius_m | No | ||
| container_kind | No | containers: solid | fluid | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's job is domain semantics — and it delivers: `spendable` is defined as carried + storage + Dimensional Depot, machine buffers and crates are explicitly excluded from that sum, and fluid units are stated as m3. These are non-obvious aggregation rules an agent could not infer from structured fields. Return shape is only implied, not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the two modes, then the aggregation rule, then the unit note, then the per-parameter scoping — a sensible information order with no filler. The telegraphic phrasing ('place and fill', 'shown apart, never added in') is dense but readable. Slightly clipped style costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters and no output schema, the description does the important work: it sketches what each view returns (per-item totals; per-container with place and fill) and defines the spendable aggregate. Enough to call it correctly for the common cases; the undocumented `save`/`world`/pagination parameters are the residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 55%, so the description must compensate, and it does for `item`, `show`, `near`, `container_kind` and `empty` by tying them to views. However `save`, `world`, `limit`, `offset` and especially `radius_m` (clearly coupled to `near`) carry no explanation anywhere, leaving a meaningful gap in a mutation-free but 11-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb-and-resource framing ('What you own') and immediately enumerates the two output modes: per-item totals vs per-container/crate/fluid-buffer listing. An agent can tell this is an ownership/inventory query and not a plan or factory tool. It stops short of naming a sibling (e.g. `crates`) it might be confused with, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the mode switch (`show=containers`) and then scopes which parameters apply to which view: `item=` narrows either view, while `near=`, `container_kind=` and `empty=` are containers-only. That is real routing guidance an agent can act on. No exclusions or alternative-tool pointers are given, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_buildingsARead-onlyIdempotent
Buildings by kind: power, max clock, sloop slots, footprint; marked HAVE/LOCKED against the save.
logistics also names the fastest unlocked belt and pipe, which planning assumes. Pages
with offset=; all is hundreds of rows.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| building_kind | No | production | extractor | generator | logistics | foundation | ramp | wall | pillar | beam | architecture | all | production |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, and the description adds real context: results are marked HAVE/LOCKED relative to a save, `logistics` additionally reports the fastest unlocked belt and pipe, and `all` returns hundreds of rows (a performance caution). It stops short of describing return shape or ordering, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler, and the high-value facts (what is returned, the `all` cost) are front-loaded. It is dense and jargon-heavy enough that a first-time agent may need a second pass, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six parameters, low schema coverage, and no output schema, the description does well on output attributes and pagination but leaves the three save-identifying parameters (`save`, `as_of`, `world`) and `limit` unresolved. For a tool where selecting the wrong save scoping could silently return the wrong data, that gap matters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 33% with only `as_of` and `building_kind` documented, so the description carries extra burden. It does clarify offset-based paging, the cost of `building_kind=all`, and the special behavior of `logistics`, plus hints at the save linkage via 'against the save', but `save`, `world`, and `limit` remain unexplained and the save/as_of/world relationship is ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource and the attributes returned per building kind (power, max clock, sloop slots, footprint) with HAVE/LOCKED status against the save, so the agent knows it enumerates buildings filtered by kind. The verb 'list' is only implied by the name rather than stated, and no sibling (e.g. factory_query, factory_map, list_factories) is contrasted, which keeps it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the note that pages are paged with offset= and that `all` is hundreds of rows gives practical guidance about when to paginate or avoid `all`. There is no explicit statement of when to reach for this tool over factory_query or factory_map, nor any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_factoriesBRead-onlyIdempotent
Named factories of this world (the names factory= takes), with how much of each still stands.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds two behavioral facts: results are scoped to the current world, and each entry includes a degradation/status figure. It says nothing about ordering, pagination, or what happens for worlds with no factories.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with a clarifying parenthetical; nothing is padding. The closing phrase 'how much of each still stands' is evocative but slightly vague about the actual metric returned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple zero-required-parameter read with no output schema, and it does communicate the return shape at a high level. However, with three optional parameters whose interplay (current vs. pinned world/save) is unexplained, an agent still has to guess about defaults and scope selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only 33% of the schema is documented (as_of alone), and the description does not compensate: the 'world' parameter is only obliquely gestured at via 'this world', and 'save' is never mentioned or distinguished from as_of, even though both appear to be optional save-pinning knobs. An agent cannot tell from this text what leaving them null does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list named factories) scoped to 'this world', and adds that each entry carries a completeness/status measure ('how much of each still stands'). It implicitly distinguishes itself from siblings like factory_health or factory_query by returning names plus status, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(the names factory= takes)' is a useful usage cue: call this to discover the factory identifiers other tools expect. But there is no explicit when-to-use/when-not guidance and no named alternative among the many factory-related siblings (factory_map, factory_sites, factory_query).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_regionsARead-onlyIdempotent
Named map regions with anchor coordinate, area and node count; resource= keeps regions holding it.
Names are advisory (boundaries about 256 m); any name works as a region: selector. The anchor provably lies inside the region.
| Name | Required | Description | Default |
|---|---|---|---|
| resource | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, idempotent, closed-world operation. The description adds meaningful behavioral context beyond that: region names are advisory with roughly 256 m boundaries, and the anchor is guaranteed to lie inside the region.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is compact and front-loads the core output description before the filter behavior and the two caveats. Every sentence adds useful information, with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional parameter and no output schema, the description covers the returned fields, the filter behavior, naming caveats, and the anchor guarantee. It could be slightly more complete with ordering or pagination details, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the burden for the single optional parameter. It does so by explaining that `resource=` keeps only regions containing that resource, which gives the parameter clear filtering semantics beyond the bare string/null schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as named map regions and lists the returned attributes: anchor coordinate, area, and node count. It also mentions the resource filter, but does not explicitly differentiate this tool from nearby siblings such as show_on_map, describe_location, or factory_map.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the semantics of the `resource=` filter, but gives no explicit guidance on when to call this tool versus alternatives or when not to use it. The note about `region:<name>` selectors is useful context, yet it is not framed as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_worldsBRead-onlyIdempotent
Saves grouped by world, newest first: the names save= and world= take (default: newest save).
world= lists one world's saves, offset= pages them.
| Name | Required | Description | Default |
|---|---|---|---|
| world | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, non-destructive, and closed-world. The description adds useful behavioral context beyond that: grouping by world, newest-first ordering, default selection of the newest save, and pagination via offset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the grouping/sort behavior, but the phrase 'the names save= and world= take' is awkward and introduces an unexplained parameter name. It is concise but not cleanly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers grouping, sorting, default behavior, and pagination. It still leaves ambiguity about the response shape and the nonexistent 'save=' reference, so it is only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains world= and offset= somewhat, but also references 'save=' even though no save parameter exists in the schema, creating confusion for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the core result: saves grouped by world, ordered newest first. It is clear enough to understand what the tool returns, though it does not explicitly say 'list' and does not distinguish itself from siblings like world_summary or plans.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives parameter-driven usage hints: world= lists one world's saves and offset= pages them. However, it provides no explicit guidance on when to choose this tool over alternatives such as world_summary or list_factories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phase_requirementsCRead-onlyIdempotent
Space Elevator: the current phase and what it still wants.
The save's per-phase item table is deprecated; trust the header line over it.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds a genuine data-quality caveat (deprecated per-phase item table; trust the header line), which is context beyond annotations. However, it doesn't mention what the tool returns, whether 'save' defaults to the current save, or how 'as_of' pinning affects the answer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and payload; no wasted clauses. The only weakness is that its brevity leaves important details out, but it isn't padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should describe the return shape (current phase name, item list?) more explicitly. With three optional parameters of ambiguous semantics and no guidance on defaults or save pinning, an agent lacks enough to call this confidently without inspecting the schema and experimenting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only 'as_of' is documented). The description adds no meaning for 'save' or 'world' — it only vaguely references 'the save's per-phase item table' without explaining how to supply or resolve a save. With low coverage, it should compensate but doesn't.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (Space Elevator current phase) and payload ('what it still wants'), which is concrete enough for an agent to know what it returns. No sibling tool overlaps this topic, but the description doesn't explicitly differentiate from alternatives like research or plans. Minor gap: no explicit verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to call this versus alternatives, no prerequisites, no mention of the save/as_of/world interplay. The sentence about the deprecated per-phase item table is a data-trust warning, not usage guidance. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_factoryA
Solve a factory plan by LP over this world's unlocked recipes: machines, rates, power, exports, byproducts.
sources= node selectors, combinable; omit = whole map: "north", "region:Northern Forest",
"near:@<radius_m>", "node:" (search_resource_nodes lists ids), "grid:X3Y4",
"resource:Crude Oil".
objective: max_mw | max_item | min_raw | min_raw_power | min_machines | min_power.
Omitted: min_raw_power when export_minimums asks for an item, else max_mw. Machine
counts are whole buildings at one derived clock.
exports= whitelist of what may leave, REPLACING the default (omitted: a goalless rate
exports its items on grid power, else power only); [] = only export_minimums, grid power.
Listing "MW" exports power and forbids grid draw: ["MW","Plastic"].
extractor_clocks overclocks source nodes only; clocks spreads a row over more, slower
machines at machine_cost_mw each. Power Shards are not counted.
required= recipes (exact name or class id) that must make their item, excluding their
rivals; a locked one is refused.
save_as= stores the request, never the solution; over an existing plan pass base_rev.
plan= recalls a saved plan and re-solves it.
Unsaved, the answer ends plan="solve:..." for the other plan tools (held until restart).
site_at= with save_as records where the plan stands and measures the water there.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | recall a saved plan (name or pin:N); other arguments override this call only | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| clocks | No | clock options for production rows, e.g. [0.5, 1.0]; omit = 1.0 | |
| sloops | No | Somersloops the plan may spend; 0 spends none | |
| exports | No | ||
| save_as | No | store this request under a name | |
| site_at | No | with save_as: where the plan stands (footprint centre): 'x,y[,z]' in metres, 'me', a factory name, 'slab:<n>', 'chain:<n>'/'pipe:<n>' | |
| sources | No | ||
| base_rev | No | the plan version you read; needed to save over an existing plan | |
| overflow | No | 'sink': minimums exports omits are sunk, power from the grid | |
| required | No | recipes that must make their item; others for it are excluded | |
| supplied | No | items another plan hands this one, {item: per-minute} | |
| objective | No | omitted: min_raw_power with export_minimums, else max_mw | |
| allow_sinks | No | ||
| for_factory | No | factory this plan is built at; also 'auto', 'whole world', 'none' | |
| power_price | No | points per MWh for payback pricing; omit = the save's grid mix; 'default' resets a saved plan to it | |
| target_item | No | the item max_item maximises | |
| only_recipes | No | ||
| recycle_once | No | recipes that may run but must not feed each other, e.g. ['Recycled'] | |
| site_yaw_deg | No | site orientation: degrees about world Z, positive +X towards +Y | |
| payback_hours | No | hours of play in which slower extra machines must repay their build points in saved power; 0 = plain build; stops 1, 2, 5, 10, 20, 50, 100; from 5 h, max_mw and min_power price machines at build points instead of machine_cost_mw; 'default' = shared setting | |
| row_overclock | No | per recipe (exact name or class id): 'last' overclocks the row's last machine, 'spread' adds one underclocked machine, 'default' follows overclock_last; unnamed rows keep their stored choice | |
| overclock_last | No | build each row one machine short, the last overclocked (1-2 Power Shards, checked against shards in hand plus craftable from slugs); 'default' = shared setting | |
| site_footprint | No | 'WxD' in metres; blank = the layout's own square | |
| exclude_recipes | No | ||
| export_minimums | No | {item: per-minute} minimum exports; the 'rate' request | |
| logistics_items | No | items whose belt/pipe rows to pin, whatever their volume | |
| machine_cost_mw | No | ||
| only_free_nodes | No | skip nodes an extractor already taps | |
| plan_notes_text | No | note stored with save_as | |
| extractor_clocks | No | clock options for source nodes, e.g. [1.0, 1.5, 2.0, 2.5] | |
| water_extractors | No | how many Water Extractors your site can actually hold |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses significant behavior: save_as stores the request rather than the solution, base_rev is required to overwrite, the default objective depends on export_minimums, exports replace defaults with special [] and 'MW' semantics, locked required recipes are refused, and the temporary solve token is explained. It does not cover every execution or error detail, but it is substantially richer than the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the dense notes are mostly justified for a 35-parameter tool. The telegraphic shorthand and occasional run-on punctuation reduce readability, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex LP planning tool with no output schema, it explains the key non-obvious defaults, save/overwrite behavior, export rules, and token handoff. It still omits details for several parameters and gives only broad output categories, so it is not fully complete but covers the main failure points.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 74% schema description coverage, the description still adds meaningful semantics for high-impact parameters such as sources selector syntax, objective values and defaults, exports replacement behavior, required recipes, save_as/base_rev, and plan recall. Many of the 35 parameters are still left to the schema, so it is strong but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource, 'Solve a factory plan by LP', and lists the planning outputs: machines, rates, power, exports, byproducts. It does not explicitly distinguish itself from nearby plan tools such as plan_from_factory or plan_layout, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is largely a parameter manual and never says when to choose plan_factory over plan_from_factory, plan_layout, site_plan, or edit_plan. Mentioning that the answer token is for 'other plan tools' is not enough to guide tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_from_factoryB
Save a plan mirroring a named factory as built, to edit or extend.
Recipes pinned, inputs supplied, surplus exported (sunk under the flow stance); an unedited equal plan is reused. Differences from the build go in the notes.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| factory | Yes | a factory name, as list_factories prints it | |
| preview | No | solve and compare, save nothing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-readonly, non-destructive, non-idempotent write, and the description adds real substance on top: recipes get pinned, inputs supplied, surplus exported under the stated flow stance, equal plans are reused, and differences are recorded in notes. The gaps are the cryptic "sunk under the flow stance" clause and no statement of permissions or what a failure looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence and total length is short. But the second paragraph is dense jargon with an opaque parenthetical, so it is compact at the cost of parseability rather than genuinely efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation with no output schema, the description covers the semantics of the write reasonably (pinning, reuse, export, notes) but leaves the return unknown and half the parameters unexplained. It is enough to avoid a wrong call, not enough to call it confidently with the right argument values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates for none of it: save, as_of, world, and factory are never explained (as_of's sav: token hint lives only in the schema). Worse, "Differences from the build go in the notes" references a "notes" concept that is not a parameter at all, which can send an agent looking for a field that does not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Save a plan mirroring a named factory as built, to edit or extend" specifies a concrete verb (save/mirror) and resource (a factory-derived plan) plus the intended follow-on use. It is clearly understandable without opening the schema, but it never differentiates itself from plausible siblings such as plan_factory, import_plan, or edit_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Phrases like "as built, to edit or extend" imply the situation (you want an editable copy of an existing factory rather than a fresh solve). However, there is no explicit when-to-use/when-not and no named alternative, even though siblings plan_factory, import_plan, and commission_plan occupy adjacent territory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_layoutBRead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | Yes | a saved plan's name or pin:N, or the solve: handle plan_factory printed | |
| save | No | ||
| show | No | floors | blocks | buses | trunks | materials | sites | floors |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| sites | No | show="sites": {"rig": ["Heavy Oil Residue"], "hall": ["MW"]}; "MW" claims every generator | |
| world | No | ||
| factory | No | fit against this factory's existing platform | |
| belt_tier | No | belt tier name; blank = fastest unlocked | |
| pipe_tier | No | pipe tier name; blank = fastest unlocked | |
| order_floors_by | No | "chain" (build order) or "head" (minimise fluid lift) | chain |
| max_floor_foundations | No | cap a deck at this many 8m foundations; 0 = one stage per deck |
TDQS
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.
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.
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.
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.
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.
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.
plansARead-onlyIdempotent
List this world's saved plans (version, last change, world moved?), or one plan's versions with name=.
With name=, show='request' prints the stored arguments, what the selectors resolved to and the siting, solving nothing; a forgotten plan is found too. Pass the version (v14 -> base_rev=14) to any tool that changes the plan; edit_plan renames, forgets, undoes, restores.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | one plan: its versions, or show='request' | |
| save | No | ||
| show | No | with name: versions | request | versions |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| since | No | list versions after this one | |
| world | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description still adds real behavior: the request view 'solves nothing', forgotten plans remain discoverable, and the v14 -> base_rev=14 mapping to mutation tools. Return shape and pagination behavior are not described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The list-then-single-plan distinction is front-loaded, which is good, but the second sentence is a dense run of clauses joined by semicolons and commas ('prints the stored arguments, what the selectors resolved to and the siting, solving nothing; a forgotten plan is found too') that takes effort to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Seven optional parameters, 57% schema coverage and no output schema mean the description has to do real work, and it covers the two modes plus the version convention. It leaves the as_of/save pinning, limit behavior, and what fields come back for a version list unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, and the description carries the most important semantics: name selects single-plan mode and show='request' switches the view. However, save, as_of, limit, and world are left entirely to their (partly absent) schema descriptions, and 'since' is explained only in the schema. Adequate but incomplete compensation for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource: list this world's saved plans, or one plan's versions when name is given. The two modes are clearly delimited, and edit_plan is named as the mutating counterpart. The parenthetical 'world moved?' is jargon that only a returning user would parse, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says what show='request' is for ('prints the stored arguments, what the selectors resolved to and the siting, solving nothing') and routes renames/forgets/undoes/restores to edit_plan. It also states the cross-tool convention of passing the version as base_rev. It stops short of saying when to use this versus diff_vs_save or plan_from_factory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
power_reportBRead-onlyIdempotent
Grid generation capacity vs machine draw, nameplate and measured, and what is free now.
Nameplate: everything built running at once. Measured: each machine weighted by its 300 s productivity window. Generation is capacity on both, except a generator out of fuel or water whose monitor read zero is listed starved: those MW will not arrive.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| biomass | No | count hand-fed biomass burners as generation; omitted: the shared setting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/destructive=false, so the safety bar is low; the description instead adds genuine behavioral semantics beyond them — the 300 s productivity window for measured draw, and the 'starved' state where generators with zero monitor readings are reported but their MW will not actually arrive. That starvation caveat is exactly the kind of non-obvious detail that prevents a misread of the numbers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short, front-loaded: the comparison is stated first, then each term is defined in one clause. Dense but every sentence carries vocabulary needed to read the report; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description rightly explains the report's vocabulary (nameplate, measured, starved), which is the bulk of what an agent needs to interpret results. However it says nothing about scoping (which save/world is reported on when 'save' and 'as_of' are omitted) or the effect of toggling biomass, leaving those behaviors unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: 'save', 'world' and the required semantics of 'as_of' are undocumented in both schema and description. The description never mentions any parameter — not even that 'biomass' toggles whether hand-fed burners count, despite that being a visible modeling decision in the output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the exact resource pair being compared (grid generation capacity vs machine draw) plus the 'free now' headroom, which no sibling tool covers — the sibling list is all factory/plan/recipe tooling. It stops short of naming a sibling it is distinct from, but the scope is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'what is free now' implies the use case (checking power headroom), and the nameplate/measured definitions imply the two modes of comparison. There is no explicit when-to-use, no prerequisite, and no alternative tool named, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_factoriesARead-onlyIdempotent
Proposed factories: what is built, clustered by slabs, proximity, belts, shared products and supply.
Errs toward splitting: never merges two factories, may return one in pieces. The # column is the proposal: selector other tools take, numbered over all proposals so paging does not shift it. Name one with edit_factory. unnamed_only=true answers 'what have I built and not named'.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| max_span_m | No | cap on a proposal's diameter, metres | |
| unnamed_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, so credit goes to genuine extras: it discloses that results err toward splitting, never merge, and may return one factory in pieces. It also explains that the proposal selector is numbered across all proposals so paging does not shift it — a real behavioral caveat. No info on ordering or total counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded: what it returns first, then behavioral caveats, then selector mechanics and usage hooks. A few phrases ('clustered by slabs, proximity, belts, shared products and supply') are dense jargon but each sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns; it covers the # selector column and the clustering concept but not the other fields an agent will see. Paging stability is addressed, but the overall return shape remains only partially characterized.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 29% across 7 params; the description adds meaning for unnamed_only and ties the proposal:<n> selector to results, and as_of/max_span_m are described in-schema. But save vs. world vs. as_of distinctions and limit/offset behavior are left to the schema, so it only partly compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Proposed factories: what is built') and characterizes the clustering basis (slabs, proximity, belts, shared products/supply), which lets an agent distinguish it from list_factories. It is jargon-heavy ('slabs') and never plainly says 'infers factories from built structures', keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete usage hooks: name a proposal with edit_factory, and unnamed_only=true for 'what have I built and not named'. It never contrasts with the obvious sibling list_factories, nor states when not to call it, so usage is implied rather than fully routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rank_build_sitesARead-onlyIdempotent
Rank fields for a new extraction site of one resource, best first.
Scores untapped reachable capacity against spread, distance to your buildings, purity
and terrain; every raw component is shown to re-weight, the score is a start, not a
verdict. sources= narrows the area with search_resource_nodes' selectors; omit for the
whole map. No offset: raise limit or narrow sources.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| sources | No | ||
| resource | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely new behavioral detail: every raw scoring component is exposed for re-weighting, the score is advisory, and there is no offset so pagination must go through limit/sources. That is useful beyond-annotation context, though permissions/cost/return shape aren't discussed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and ranking explanation are front-loaded and dense with signal; the trailing notes on sources and pagination earn their place. Slightly verbose in the middle clause about raw components but no true waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read-only tool with no output schema, the description adequately covers ranking semantics, the sources selector, and pagination, but does not explain the save/as_of/world interplay that matters for result scoping. An agent could still mis-scope a call by guessing at those params.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 17%, so the description must compensate. It usefully explains `sources` semantics and the `limit`-instead-of-offset rule, but leaves `resource` (the only required param), `world`, `save`, and `as_of` — including the distinction between save and as_of — entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Rank fields for a new extraction site of one resource, best first' — and immediately conveys the output ordering. An agent can distinguish it from search_resource_nodes, which it explicitly references as a complementary selector source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use condition for `sources` (narrows the area, omit for whole map) and names the sibling whose selectors it accepts. It also explains the no-offset pagination rule. What's missing is a when-not-to-use-this / alternative-tool clause beyond the sources hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rank_unlocksBRead-onlyIdempotent
Value of each locked alternate recipe to THIS plan: re-solve with it added and report the delta in the plan's own units.
A zero delta is an answer. Deltas are an upper bound: a candidate needing an unbuilt machine is judged as if built, and the machine is named. Alternates on a pending hard drive are flagged as claimable now.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | Yes | a saved plan's name or pin:N, or the solve: handle plan_factory printed | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| query | No | only test alternates whose name matches | |
| world | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/idempotent/non-destructive, and the description adds real behavioral context beyond that: deltas are an upper bound, candidates needing unbuilt machines are judged as if built and the machine is named, and hard-drive-pending alternates are flagged claimable now. It doesn't mention cost of the repeated re-solves or the shape of the ranked output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core definition followed by two short caveat blocks; every sentence carries information. The line-broken formatting is slightly ragged but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what the ranking looks like (ordering, units, tie handling with limit), which it only gestures at via 'the plan's own units'. The behavioral caveats are good, but the parameter/save-scope story and the output form are left incomplete for a six-parameter analysis tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Six parameters at 50% schema coverage, and the description mentions none of them. The undocumented save, as_of, world, and limit fields get no explanation anywhere, and even the meaning of 'plan' (name vs pin:N vs solve: handle) is only conveyed by the schema, not the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action on a specific resource: it values each candidate locked alternate recipe relative to THIS plan by re-solving and reporting the delta. That is distinguishable from sibling listing tools like alternates_for_item or unlocked_recipes, though the description never names those siblings to make the contrast explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by phrases like 'locked alternate recipe' and 'THIS plan', and it gives interpretation guidance ('A zero delta is an answer'), but it never states when an agent should call this instead of alternates_for_item, hard_drives, or compare_recipe_options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recipe_detailCRead-onlyIdempotent
One recipe's exact numbers: in/out per minute, machine, cycle, power, unlock source.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| recipe_id | Yes | class id or display name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, non-destructive, so safety is covered. The description's real contribution is disclosing the returned fields, which matters since there is no output schema, but it says nothing about what happens when a recipe is absent or how save/world scope alter the answer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded line with no filler, which is good. But it is compressed to the point of being cryptic ('unlock source', 'in/out per minute'), so brevity costs some interpretability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter lookup with no output schema and half its parameters undocumented in the schema, the description should explain save/world scoping and the multiple-save case. As written, an agent can call it but cannot predict how save and world change the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: recipe_id and as_of are documented, while save and world carry no description anywhere. The tool description does not compensate at all - it never mentions save, world, or as_of, and 'unlock source' in the field list does not clarify what those parameters do.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the resource and enumerates the fields returned (in/out per minute, machine, cycle, power, unlock source), so an agent knows this is the single-recipe detail lookup. It never distinguishes itself from nearby siblings such as search_recipes, compare_recipe_options, or unlocked_recipes, and the verb is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this versus list/search alternatives, no prerequisites, and no exclusion. The word 'One' implies single-item scope, but the agent must infer that from a fragment rather than from explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
researchARead-onlyIdempotent
HUB milestones or MAM research: what is left, what it costs, what spendable stock affords now.
HUB: READY is about the bill; a tier the Space Elevator has not opened shows the phase
that opens it (phase_requirements). MAM rows marked LOCKS gate a capability (Depot,
Power Augmenter, Somersloop amplification), not a recipe. tier= is HUB only.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| show | No | all | todo | affordable; todo hides what is finished | todo |
| tier | No | hub only: one HUB tier 1-9; omit for all | |
| tree | No | hub (milestones) | mam | hub |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| query | No | filter by name, case-insensitive | |
| world | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description genuinely adds interpretive context the annotations cannot: READY is about the bill, a locked tier surfaces the phase that opens it, and MAM 'LOCKS' rows gate capabilities rather than recipes. It does not cover result ordering or pagination behavior behind limit/offset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded and the whole thing is short, but the layout is ragged: sentences break mid-clause, 'what is left, what it costs, what spendable stock affords now' compresses three ideas without punctuation, and the trailing '`tier=` is HUB only' dangles as a stray fragment.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, no-output-schema tool this is only partially sufficient. It does explain how to read the results (READY, LOCKS, phase_requirements), which is valuable, but leaves five parameters undefined and gives no guidance on combining `tree`, `show`, and `tier`, which is the main misuse risk here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56%, so about half the parameters carry their own docs. The description only reinforces `tier=` as HUB-only, which the schema already states word for word, and only implicitly maps 'HUB milestones or MAM research' to `tree`. It never touches `save`, `world`, `query`, `limit`, or `offset`, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause names both resources (HUB milestones, MAM research) and the three things it answers: what is left, what it costs, what stock affords now. An agent can tell this is a read/progress-and-cost lookup. It never contrasts itself with close siblings like phase_requirements, bom, or rank_unlocks, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states one real routing constraint, '`tier=` is HUB only', and explains the pending/READY distinction via `show`/READY semantics. There is no when-to-use vs. when-not guidance, no mention of `tree=mam` vs. hub selection, and no pointer to the sibling that answers the overlapping questions (phase_requirements, rank_unlocks).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_conduitsARead-onlyIdempotent
Belt and pipe runs near a place or between two areas: both ends, length, elevation, what each end connects to.
A run is one belt chain (split at splitters, mergers and machines) or one placed pipe;
longest first; its id (chain:, pipe:) is a place every tool takes. Proximity is
measured against the drawn line, so a run crossing mid-span counts. show=networks
lists each fluid network instead (fluid, pipe length, centre, what it ends on), distance
from near=; network=N lists its pipes.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | second area: only runs passing near BOTH; same forms as near | |
| near | Yes | centre: 'x,y' in metres, 'me', a factory name, or a run id from this tool ('chain:7', 'pipe:333') | |
| save | No | ||
| show | No | runs | networks | runs |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| network | No | list every pipe of this fluid network (ids from show=networks) | |
| radius_m | No | ||
| to_radius_m | No | radius around `to`; defaults to radius_m | |
| conduit_kind | No | belt | pipe | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. Beyond that, the description adds meaningful behavior: results are sorted longest first, proximity is measured against the drawn line so mid-span crossings count, and the show/network mode switches the returned entity type. Missing detail on pagination/limit behavior and default radius handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then layers in entity definition, sort order, and alternate modes. Dense but each sentence earns its place; only mildly jargon-heavy for an unfamiliar reader.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 covers the conceptual model and main modes well but leaves several parameters (radius defaults, save/world, limit/offset) undocumented. An agent can call the core path but lacks guidance on pagination and scoping parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 58% schema coverage, the description compensates for the key semantic params: near (centre forms incl. run ids), to (second area, both-proximity), show modes, network=N, and conduit_kind via 'belt and pipe'. However several params (radius_m which defaults to 250, save, world, limit, offset) are unexplained in both schema and description, leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Belt and pipe runs near a place or between two areas') and enumerates the exact fields returned (both ends, length, elevation, what each end connects to). It defines what a 'run' is (one belt chain or one placed pipe) and its id format, so an agent understands the entity precisely. No sibling offers conduit search, so it is naturally distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear use contexts: 'near a place or between two areas', and explains the alternate modes ('show=networks' lists fluid networks, 'network=N' lists its pipes). It also clarifies the 'between two areas' semantics for the to parameter. No explicit when-not or comparison to other search tools, but usage is well conveyed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_itemsCRead-onlyIdempotent
Find items by name: form, MJ and sink points.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds that results include 'form, MJ and sink points,' which is useful output context, but it does not describe pagination behavior or how limit/offset affect results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short and front-loads the main action, which is good. But the phrase 'form, MJ and sink points' is ambiguous and does not clearly earn its place without more explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with three undocumented parameters and no output schema, the description is too thin. It gives the core action and hints at returned fields, but omits pagination semantics and does not clarify parameter usage, which an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden of explaining parameters. It only implies that 'query' is an item name and says nothing about 'limit' or 'offset,' leaving the pagination parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Find items by name.' This makes the core purpose understandable. However, it does not distinguish itself from sibling tools such as search_recipes or recipe_detail, and the trailing phrase 'form, MJ and sink points' is cryptic without additional context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives. The description implies item-name lookup but does not mention search_recipes, recipe_detail, or any exclusion or prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_recipesBRead-onlyIdempotent
Search recipes by name, or by what they consume/produce; marks HAVE/LOCKED against the save.
consumes= is the reverse lookup (every recipe that eats an item); with produces=
too, only recipes doing both. The header counts every recipe_kind over the whole table,
whatever recipe_kind shows.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| query | No | ||
| world | No | ||
| offset | No | ||
| consumes | No | ||
| produces | No | ||
| recipe_kind | No | part | building (build-gun costs) | manual | all | part |
| include_events | No | ||
| only_alternates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive. The description adds genuine behavioral context: results are marked HAVE/LOCKED against the save, and the header counts all recipe_kinds regardless of the recipe_kind filter — a non-obvious quirk worth disclosing. It says nothing about pagination, empty results, or save-resolution behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences plus a header note, front-loaded with the primary capability. No filler, though the header-count sentence is buried at the end where its relevance to filtering is easy to miss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, 18% schema coverage, and no output schema, the description should carry much more weight. It covers the relational filters and the result markers but omits the meaning of include_events, only_alternates, world/save/as_of, and paging — an agent cannot confidently call this tool without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 18% across 11 parameters, so the description must compensate. It clarifies consumes, produces, and their combination, but leaves save, as_of, world, query, limit, offset, include_events, and only_alternates completely undocumented in both schema and description — a large gap for a tool with this many knobs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Search recipes') and immediately broadens the retrieval model to name or by consumes/produces relation. It doesn't explicitly contrast itself with siblings like recipe_detail or alternates_for_item, but the reverse-lookup framing is distinctive enough to separate it from a plain lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the semantics of consumes= and the consumes+produces combination, which implies when each mode is useful, but it never states when to prefer this tool over recipe_detail, compare_recipe_options, or alternates_for_item. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_resource_nodesARead-onlyIdempotent
Resource nodes as fields (clusters within 200 m, by yield), nodes (one row each) or nearest (by distance from near=).
sources= is a list of node selectors; locations union, filters intersect; omit for
the whole map: north|south|east|west|northeast|..., region:, grid:X3Y4,
node:, pin:, near:@<radius_m>, bbox:x1,y1,x2,y2 (metres),
resource:, purity:, kind:; all in a filter means no filter. Printed
node_ids are reusable as node:. Water has no nodes: asking for it lists fracking
satellites, the bodies already pumped and sea level.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | node | well_sat | geyser | all | |
| near | No | 'x,y' (m), 'me' or a factory; @<radius_m> keeps what is within; show=nearest needs it; adds distances | |
| save | No | ||
| show | No | fields | nodes | nearest | fields |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| purity | No | pure | normal | impure | all | |
| status | No | free | tapped | all; only_free=true means free | |
| sources | No | ||
| resource | No | ||
| only_free | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds meaningful behavior beyond annotations: sources union and filters intersect, printed node_ids are reusable, near adds distances, and water has no nodes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the three output modes before explaining selectors. It is dense and somewhat cryptic, but nearly every phrase carries useful operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 13-parameter search tool with no output schema, the description covers the core query modes and source syntax reasonably well. It still omits details about pagination behavior, returned fields, and several parameters, so it is only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 46%, so the description must carry substantial parameter meaning. It does explain the complex sources selector and near/show behavior well, but leaves several of the 13 parameters, including save, world, limit, offset, status, and only_free, largely or entirely unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns resource nodes in three modes: clustered fields, one-row-per-node, or nearest-by-distance. It is specific about the resource and output shape, but does not distinguish it from sibling search/map tools such as show_on_map or factory_map.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides usage details for parameters, including that sources can be omitted for the whole map and that show=nearest requires near. However, it gives no explicit guidance on when to choose this tool over sibling tools, leaving tool selection implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_machinesARead-onlyIdempotent
Preview which machines a selector picks, before naming them with edit_factory.
Run it first on product: terms, which also pick machines feeding that product inside other sites. slab: answers what stands on a platform, and describes an empty one.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| split | No | keep only the largest spatial cluster | |
| world | No | ||
| expand | No | pull in everything belted to the result | |
| select | Yes | selector terms: product:<item> | recipe:<name> | building:<name or class> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | pin:<n> | all. Terms are ANDed; commas inside one term OR; a leading '-' excludes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds non-obvious semantics: product: selectors also pull machines feeding that product in other sites, and slab:<n> describes an empty platform rather than returning nothing. It doesn't say what the preview output looks like (counts, ids, grouping) or whether there are result limits, which is the main gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the preview-vs-edit relationship lands in the first clause, with the selector-specific caveats following. The awkward line breaks and sentence fragments in the latter two sentences cost a bit of polish but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should describe what a 'preview' actually returns; it never does. With 6 parameters and two (save, world) undocumented anywhere, an agent still has to infer scope and result shape before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the description adds real meaning to the selector vocabulary (product:, slab:<n>), but says nothing about save, world, or how expand/split interact with the preview. Baseline 3 is appropriate since the schema carries most parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — preview which machines a selector picks — and immediately distinguishes itself from the write-side sibling edit_factory. An agent can tell it apart from list_factories or factory_query without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context ('before naming them with edit_factory', 'run it first on product: terms') and explains what slab:<n> is for. It stops short of stating exclusions or naming a non-preview alternative for inspecting machines, so it's clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settingsAIdempotent
Settings the page and chat share; change one only when the user asks.
stage_headroom: what diff_vs_save and commission_plan stage a plan against when it stores none. biomass: default of every biomass= parameter. payback_hours, overclock_last: what a plan that sets neither follows. The page's Settings tab shares the file and follows a change. Base map types are listed read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| change | No | settings to change, e.g. {"stage_headroom": "nameplate"}; null resets one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-destructive, idempotent, closed-world mutation. The description adds useful behavioral context beyond that: the settings file is shared with the page's Settings tab, changes are followed there, and base map types are listed read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core constraint is front-loaded in the first sentence, and the following notes are compact and relevant. The wording is somewhat cryptic and line-broken, but it does not waste many words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter settings tool with annotations and no output schema, the description is mostly adequate. It still leaves ambiguity around how current settings are read and what calling without a change returns, which matters because no output schema exists to clarify the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for specific keys such as stage_headroom, biomass, payback_hours, and overclock_last. The schema handles the shape of 'change' and its null-reset behavior, while the description explains what several values control.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource as shared settings and implies mutation via 'change one only when the user asks,' but it never states a clear verb such as get or update. It explains several setting keys, yet an agent still has to infer the core read/write behavior from the schema and annotations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'change one only when the user asks' gives a real usage constraint, which is more than none. However, it does not say when to read versus write settings, nor does it name an alternative tool such as ui_context or any sibling for related configuration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_on_mapAIdempotent
Map links centred on a place: this project's map (draws your save) and the public one (vanilla world, nothing built).
'resource:' centres on every node of that resource with its overlays on (Crude
Oil layers confirmed; a wrong token still opens the right place). pin=true also pins
the place for the page as pin:N; mode= picks the local link's base map.
| Name | Required | Description | Default |
|---|---|---|---|
| at | Yes | a place: 'x,y' in metres, 'me', a factory name, 'node:<id>', 'machine:<instance>', 'slab:<n>', 'chain:<n>'/'pipe:<n>', 'plan:<name>', 'pin:<n>'; or 'resource:<name>' for every node of one resource | |
| pin | No | also pin it on the page (pin:N) | |
| mode | No | base map for the local link: an id settings() lists, or plain | |
| save | No | ||
| zoom | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| layers | No | public-map layer tokens; a pickup group also shows locally |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false with idempotentHint=true, and the description is consistent with a side-effecting-but-idempotent call: pin=true pins the place for the page, which explains the non-read-only hint. It also adds real behavioral context the annotations cannot convey, e.g. that a wrong token still opens the right place, that resource: centres on every node with overlays, and that the public map shows an unbuilt vanilla world.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key distinction (local vs public map) is front-loaded in the first clause, and the follow-up sentences cover the token grammar and pinning in a compact way. The parenthetical asides and line breaks make it denser than ideal, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema, the description explains what the links are but not the shape of the response, and several parameters (save, zoom, world) go unmentioned. The core invocation path via 'at' is well covered, so it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, so the description must add some value and it does for 'at' (token grammar), 'pin' (pins as pin:N), and 'mode' (base map). However save, zoom, world, and as_of are left to the schema, and 'world' in particular is undocumented in both places despite being ambiguous next to the local/public map distinction. Baseline 3 for partial coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and resource: it produces map links centred on a place, and immediately distinguishes the two link targets (this project's map, which draws your save, versus the public vanilla map). That is far more specific than a name restatement. It does not explicitly name a sibling such as factory_map or describe_location to differentiate itself, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is the tool for 'show me this thing on a map', and the resource:<name> and pin=true clauses hint at intended scenarios. There is no explicit when-to-use/when-not guidance and no comparison against the many sibling tools that also deal with locations (describe_location, whereami, factory_map).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
site_planADestructive
Record, update or clear where a saved plan stands (origin, yaw, footprint). Nothing is re-solved.
Origin is the footprint centre in metres; yaw is degrees about world Z as the save stores facing; footprint defaults to plan_layout's square for the largest floor, and the record says whether it was measured or derived. A siting is a record, not a constraint: re-solving ignores it, save_as over the same name keeps it. Once sited, recalls print it, diff_vs_save adds an approximate on-pad census, show_on_map at='plan:' centres on it.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | origin (footprint centre): 'x,y[,z]' in metres, 'me', a factory name, 'slab:<n>', 'chain:<n>'/'pipe:<n>'; blank keeps the stored one | |
| plan | Yes | the saved plan's name or pin:N | |
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| clear | No | drop the siting; the plan itself stays | |
| world | No | ||
| preview | No | show what the pad would meet there; writes nothing | |
| yaw_deg | No | degrees about world Z, positive +X towards +Y; omit to keep | |
| base_rev | No | the plan version you read; needed to change an existing plan | |
| footprint | No | 'WxD' in metres ('96' = square); blank keeps the stored one, else the layout's square |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description explains that this records metadata rather than re-solving, that the siting survives save_as, and that downstream tools read it. The schema adds specifics about clear and preview, but the description itself provides strong behavioral context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, and subsequent sentences explain non-obvious behavior. The prose is dense and uses domain-specific terms like recalls and on-pad census, but it is appropriately sized for a 10-parameter mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with no output schema, the description covers the key conceptual model, side effects, persistence behavior, and downstream consumers. It leaves some parameter details and return behavior to the schema, but the overall context is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high, and the description adds meaningful semantics beyond the schema for the key spatial parameters: origin is the footprint centre in metres, yaw is about world Z, and footprint defaults to plan_layout's square for the largest floor. It does not clarify every parameter, such as save or world, but it adds real value where it matters most.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb set (record, update, clear) and resource (where a saved plan stands), with the exact fields affected (origin, yaw, footprint). It also clarifies that nothing is re-solved, which sharply distinguishes this from solve/layout editing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: a siting is a record, not a constraint; re-solving ignores it; save_as preserves it; and downstream tools such as recalls, diff_vs_save, and show_on_map consume it. It does not explicitly name when to choose this over edit_plan or plan_layout, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_upstreamARead-onlyIdempotent
What feeds a machine, factory or building type, or what it feeds, walked on the save's connections.
factory_query show=links answers this between named factories; this walks from one seed, e.g. which feed can be repiped without dropping the generators behind it. Direction is read from connector roles or the machine's nature; an edge with neither is walked both ways, so a feeder may be over-reported, never missed. Belts and pipes are walked through, not listed; a note names the runs crossed by the chain:/pipe: ids search_conduits takes.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| seed | Yes | machine:<instance> (or the bare instance), a factory name, or a building name | |
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| direction | No | up (what feeds it) | down (what it feeds) | up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world, so the description needn't restate safety. It instead contributes real behavior: direction is inferred from connector roles or machine nature, ambiguous edges are walked both ways so results may over-report but never miss, and belts/pipes are traversed rather than listed. The only shortfall is that result shape (per-node fields, truncation behavior) is only partially implied by the 'note' sentence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence before the sibling comparison and caveats, and there is no filler. The closing sentences are compressed to the point of being cryptic ('the runs crossed by the chain:/pipe: ids'), costing a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no output schema, and a traversal that can over-report, the description does well on direction semantics, the over-report caveat, and the conduit-id note. But it never says how `limit` truncates a walk or what `save`/`world` scope to, which matter for calling a graph walk correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: `seed` and `as_of` are documented, and `direction` is documented in the schema while the description adds real meaning about how direction is inferred. However `save`, `world`, and `limit` are undocumented in both places, and the description never explains what the limit cap does to a traversal. Adequate but leaves the 3 dark parameters unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action-resource pair: traverse the save's connection graph from a seed to find what feeds a machine/factory/building, or what it feeds. It also explicitly distinguishes itself from the sibling `factory_query show=links` (named-factory pairs vs. a single-seed walk), so an agent can pick correctly. The phrasing ('walked on the save's connections') is slightly dense but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative (factory_query show=links for queries between named factories) and the condition that selects this tool instead (walking from one seed). It adds a concrete motivating scenario ('which feed can be repiped without dropping the generators behind it') and points to search_conduits for the conduit ids the note prints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_contextAIdempotent
What the web page has open; call first when the user says 'this', 'here' or quotes an ask: or pin: id.
Names the page's view, plan and version, tab and selection, whether the page reads the same save as you, queued asks, advisories (adv: ids), and every plan version or chat solve by someone else since your last look. Listed asks are marked seen on the page; pass answered= once answered. dismissed= hides an advisory, only when the user asks.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| world | No | ||
| answered | No | ask:N ids you answered; "ask:7 <answer>" adds a line | |
| dismissed | No | adv: ids to hide on the page; "adv:3f9a snooze" hides for 1 h of play |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important side effects beyond the annotations: listed asks are marked seen on the page, answered= records an answer, and dismissed= hides an advisory only when the user asks. This is consistent with readOnlyHint=false and useful for an agent to know before invoking the tool, though it does not discuss permissions or response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the critical 'call first' condition and then packs the returned context and side-effect guidance into a compact paragraph. It is appropriately sized for a complex context tool, though the run-on enumeration could be easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the necessary work of enumerating what the tool returns: view, plan/version, tab/selection, save consistency, queued asks, advisories, and recent external changes. It also covers triggers and side effects, leaving only the save/world parameters insufficiently explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, and the description adds useful meaning for answered= and dismissed= beyond the schema descriptions. However, the save and world parameters are undocumented in both schema and description, so the description only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as a page-context retrieval tool: it states 'What the web page has open' and enumerates the page view, plan/version, tab/selection, queued asks, advisories, and recent changes. The purpose is specific, though it does not explicitly differentiate itself from the many sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a strong trigger condition: 'call first when the user says "this", "here" or quotes an ask: or pin: id.' It also constrains side-effecting parameters with 'pass answered= once answered' and 'dismissed= hides an advisory, only when the user asks.' It does not name alternatives or when-not-to-use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlocked_recipesCRead-onlyIdempotent
Recipes this world has unlocked; alternates only unless only_alternates=false. Paged by offset=.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| offset | No | ||
| only_alternates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so safety is settled. The description contributes one genuinely useful behavioral fact — that results are filtered to alternates unless only_alternates=false — but says nothing about ordering, total counts, or how offset interacts with limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short clauses, no filler, with the scope stated first. Minor noise in the truncated 'Paged by offset=.' phrasing, which reads like a fragment rather than a sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six optional parameters, low schema coverage, and no output schema: the description should clarify world/save/as_of scoping and the limit cap of 25. Instead it covers only two of six parameters, leaving an agent likely to guess at world selection semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, so the description must carry more of the burden. It explains only_alternates and offset, but leaves world, save, as_of, and limit undocumented — most importantly the save vs. as_of relationship and how 'this world' is actually selected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource precisely (recipes unlocked in a given world) and states the alternates-only default, which meaningfully narrows what this returns. It does not name or contrast with close siblings such as search_recipes or alternates_for_item, so an agent still has to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no named alternatives, even though search_recipes, recipe_detail, alternates_for_item, and rank_unlocks occupy adjacent territory. Usage is only implied by the phrase 'this world has unlocked'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whereamiBRead-onlyIdempotent
Where the player stands, and the nodes, buildings and cave around them.
Position is the save's, so an autosave can be minutes stale. near:me@<radius_m> as a
source selector plans around here.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| limit | No | ||
| world | No | ||
| radius_m | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety bar is low. The description adds genuinely useful context beyond annotations: the position comes from the save and may be minutes stale if it is an autosave, which is exactly the kind of caveat an agent needs before trusting coordinates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core purpose, followed by the staleness caveat and the selector hint. Nothing is padded, though the opening line mixes purpose and return contents in a way that is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what is returned and the staleness caveat, which is the main behavioral risk for a read-only positional tool with no output schema. It is incomplete on the 5-parameter surface (save/world/limit), leaving the agent to infer scope and pagination behavior from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% — only `as_of` is documented, and even that only in the schema. The description hints at what `radius_m` means by referencing `near:me@<radius_m>`, but `save`, `world`, and `limit` (with its max of 25) are left entirely unexplained, so the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb+resource: it reports where the player stands along with the resource nodes, buildings and cave in the surrounding area. That is far more than a restatement of 'whereami'. It doesn't explicitly differentiate itself from nearby siblings like describe_location or show_on_map, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is one concrete usage cue: the `near:me@<radius_m>` source selector can be used to plan around the current position, which tells the agent how this tool plugs into planning tools. However, there is no explicit statement of when to prefer this over describe_location, show_on_map, or world_summary, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
world_summaryBRead-onlyIdempotent
One-screen overview of a world: progress, power, problems and advisories (adv: ids).
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| as_of | No | pin to one save: the sav:… token an earlier answer printed | |
| world | No | ||
| biomass | No | count hand-fed biomass burners as generation; omitted: the shared setting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description contributes only the bounded-output notion ('one-screen'), which is modest added value; the parenthetical '(adv: ids)' is cryptic and does not explain what advisories are or how ids are used.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the scope ('one-screen overview of a world'). The trailing '(adv: ids)' is the only fragment that costs clarity without clearly earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should say more about what 'progress', 'problems' and 'advisories' actually contain and how the four parameters scope the summary. As written it is a minimum-viable orientation for an aggregation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Four parameters with only 50% schema description coverage; the description mentions none of them. The undocumented 'save' and 'world' parameters receive no compensating explanation of defaults or relationship to the described 'as_of' token.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a world) and the aggregated content areas (progress, power, problems, advisories), making it distinguishable from narrower siblings like power_report or factory_health. It is clear but does not explicitly contrast itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'One-screen overview' implies a first-look or triage use case, but the description never states when to prefer this over power_report, factory_health, or list_worlds. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
65 tool updates
v0.3.0- Removed
advise_hard_drive_pick - Changed
alternates_for_item17 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / include_locked / titleRemoved value: -"Include Locked" - removed
Input schema / properties / item / titleRemoved value: -"Item" - removed
Input schema / properties / plan / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / plan / descriptionPrevious value: -"a stored plan: add what requiring each recipe would change in it"New value: +"a saved plan: add what requiring each recipe would change in it" - removed
Input schema / properties / plan / titleRemoved value: -"Plan" - added
Input schema / properties / plan / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"alternates_for_itemArguments"
- Removed
amend_factory - Changed
bom31 fields changed- removed
Input schema / properties / allow_sinks / titleRemoved value: -"Allow Sinks" - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / exclude_recipes / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / exclude_recipes / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / exclude_recipes / titleRemoved value: -"Exclude Recipes" - added
Input schema / properties / exclude_recipes / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / item / titleRemoved value: -"Item" - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / only_recipes / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / only_recipes / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / only_recipes / titleRemoved value: -"Only Recipes" - added
Input schema / properties / only_recipes / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / outlets / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / outlets / descriptionAdded value: +"byproducts allowed out as products instead of sunk" - added
Input schema / properties / outlets / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / outlets / titleRemoved value: -"Outlets" - added
Input schema / properties / outlets / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / qty / titleRemoved value: -"Qty" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"bomArguments"
- Added
boosters - Changed
collected_from_world25 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / group / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / group / descriptionPrevious value: -"one category, e.g. 'power_slug_blue'. Omit to see them all"New value: +"one category, e.g. 'power_slug_blue'; omit for all" - removed
Input schema / properties / group / titleRemoved value: -"Group" - added
Input schema / properties / group / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / modeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write show= instead", - "title": "Mode" -} - removed
Input schema / properties / near / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / near / descriptionPrevious value: -"origin for show=nearest: 'x,y' in metres, 'me', or a factory name. Defaults to where the player is standing"New value: +"'x,y' (m), 'me' or a factory; @<radius_m> keeps what is within; nearest defaults to you" - removed
Input schema / properties / near / titleRemoved value: -"Near" - added
Input schema / properties / near / typeAdded value: +[ + "string", + "null" +] - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / show / titleRemoved value: -"Show" - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"collected_from_worldArguments"
- Changed
commission_plan41 fields changed- removed
Input schema / properties / allow_sinksRemoved value: -{ - "default": true, - "title": "Allow Sinks", - "type": "boolean" -} - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / biomass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / biomass / titleRemoved value: -"Biomass" - added
Input schema / properties / biomass / typeAdded value: +[ + "boolean", + "null" +] - removed
Input schema / properties / clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Clocks" -} - removed
Input schema / properties / exclude_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exclude Recipes" -} - removed
Input schema / properties / export_minimumsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Export Minimums" -} - removed
Input schema / properties / exportsRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exports" -} - removed
Input schema / properties / extractor_clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Extractor Clocks" -} - removed
Input schema / properties / headroom_mw / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Input schema / properties / headroom_mw / titleRemoved value: -"Headroom Mw" - added
Input schema / properties / headroom_mw / typeAdded value: +[ + "number", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / machine_cost_mwRemoved value: -{ - "default": 5, - "title": "Machine Cost Mw", - "type": "number" -} - removed
Input schema / properties / objectiveRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "omitted: min_raw_power with export_minimums, else max_mw", - "title": "Objective" -} - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / only_free_nodesRemoved value: -{ - "default": false, - "title": "Only Free Nodes", - "type": "boolean" -} - removed
Input schema / properties / only_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Only Recipes" -} - removed
Input schema / properties / plan / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / plan / defaultRemoved value: -null - changed
Input schema / properties / plan / descriptionPrevious value: -"recall a saved plan by name"New value: +"a saved plan's name or pin:N, or the solve: handle plan_factory printed" - removed
Input schema / properties / plan / titleRemoved value: -"Plan" - added
Input schema / properties / plan / typeAdded value: +"string" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / sloopsRemoved value: -{ - "default": 0, - "title": "Sloops", - "type": "integer" -} - removed
Input schema / properties / sourcesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Sources" -} - removed
Input schema / properties / target_itemRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Target Item" -} - removed
Input schema / properties / water_extractorsRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Water Extractors" -} - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - added
Input schema / requiredAdded value: +[ + "plan" +] - removed
Input schema / titleRemoved value: -"commission_planArguments"
- Changed
compare_recipe_options25 fields changed- removed
Input schema / properties / allow_sinks / titleRemoved value: -"Allow Sinks" - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / item / titleRemoved value: -"Item" - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / outlets / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / outlets / descriptionAdded value: +"byproducts allowed out as products instead of sunk" - added
Input schema / properties / outlets / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / outlets / titleRemoved value: -"Outlets" - added
Input schema / properties / outlets / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / per_resource / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / per_resource / descriptionAdded value: +"raw resource to price per unit in; omit = the one the routes share" - removed
Input schema / properties / per_resource / titleRemoved value: -"Per Resource" - added
Input schema / properties / per_resource / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / rate / titleRemoved value: -"Rate" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"compare_recipe_optionsArguments"
- Changed
crates15 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"cratesArguments"
- Changed
describe_location14 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / at / descriptionPrevious value: -"the place: 'x,y' in metres, 'me', a named factory, 'slab:<n>', or a run id like 'chain:7'"New value: +"the place: 'x,y' in metres, 'me', a factory or region name, 'node:<id>', 'slab:<n>', 'chain:<n>'/'pipe:<n>'" - removed
Input schema / properties / at / titleRemoved value: -"At" - removed
Input schema / properties / radius_m / titleRemoved value: -"Radius M" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"describe_locationArguments"
- Changed
diff_vs_save43 fields changed- removed
Input schema / properties / allow_sinksRemoved value: -{ - "default": true, - "title": "Allow Sinks", - "type": "boolean" -} - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / biomass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / biomass / titleRemoved value: -"Biomass" - added
Input schema / properties / biomass / typeAdded value: +[ + "boolean", + "null" +] - removed
Input schema / properties / clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Clocks" -} - removed
Input schema / properties / exclude_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exclude Recipes" -} - removed
Input schema / properties / export_minimumsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Export Minimums" -} - removed
Input schema / properties / exportsRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exports" -} - removed
Input schema / properties / extractor_clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Extractor Clocks" -} - removed
Input schema / properties / factory / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / factory / descriptionPrevious value: -"count this factory as built; also 'auto', 'world' or 'none'"New value: +"count only this factory's machines as built; also 'auto', 'world' or 'none'" - removed
Input schema / properties / factory / titleRemoved value: -"Factory" - added
Input schema / properties / factory / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / machine_cost_mwRemoved value: -{ - "default": 5, - "title": "Machine Cost Mw", - "type": "number" -} - removed
Input schema / properties / objectiveRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "omitted: min_raw_power with export_minimums, else max_mw", - "title": "Objective" -} - removed
Input schema / properties / only_free_nodesRemoved value: -{ - "default": false, - "title": "Only Free Nodes", - "type": "boolean" -} - removed
Input schema / properties / only_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Only Recipes" -} - removed
Input schema / properties / plan / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / plan / defaultRemoved value: -null - changed
Input schema / properties / plan / descriptionPrevious value: -"recall a saved plan by name"New value: +"a saved plan's name or pin:N, or the solve: handle plan_factory printed" - removed
Input schema / properties / plan / titleRemoved value: -"Plan" - added
Input schema / properties / plan / typeAdded value: +"string" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - added
Input schema / properties / show_cost / descriptionAdded value: +"include the bill of what is left to build against spendable stock" - removed
Input schema / properties / show_cost / titleRemoved value: -"Show Cost" - removed
Input schema / properties / sourcesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Sources" -} - removed
Input schema / properties / stage / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / stage / titleRemoved value: -"Stage" - added
Input schema / properties / stage / typeAdded value: +[ + "integer", + "null" +] - removed
Input schema / properties / target_itemRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Target Item" -} - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - added
Input schema / requiredAdded value: +[ + "plan" +] - removed
Input schema / titleRemoved value: -"diff_vs_saveArguments"
- Added
edit_factory - Added
edit_plan - Changed
explain_byproducts27 fields changed- removed
Input schema / properties / allow_sinksRemoved value: -{ - "default": true, - "title": "Allow Sinks", - "type": "boolean" -} - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / exclude_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exclude Recipes" -} - removed
Input schema / properties / export_minimumsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Export Minimums" -} - removed
Input schema / properties / exportsRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exports" -} - removed
Input schema / properties / item / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / item / descriptionAdded value: +"one byproduct to focus on; omit = the whole plan" - removed
Input schema / properties / item / titleRemoved value: -"Item" - added
Input schema / properties / item / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / objectiveRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "omitted: min_raw_power with export_minimums, else max_mw", - "title": "Objective" -} - removed
Input schema / properties / only_free_nodesRemoved value: -{ - "default": false, - "title": "Only Free Nodes", - "type": "boolean" -} - added
Input schema / properties / planAdded value: +{ + "description": "a saved plan's name or pin:N, or the solve: handle plan_factory printed", + "type": "string" +} - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / sourcesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Sources" -} - removed
Input schema / properties / target_itemRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Target Item" -} - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - added
Input schema / requiredAdded value: +[ + "plan" +] - removed
Input schema / titleRemoved value: -"explain_byproductsArguments"
- Changed
factory_floors23 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / factory / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / factory / descriptionPrevious value: -"a named factory, or any machine selector"New value: +"a factory name or one selector term" - removed
Input schema / properties / factory / titleRemoved value: -"Factory" - added
Input schema / properties / factory / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / platform / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / platform / descriptionPrevious value: -"one platform by the index this tool hands out"New value: +"one platform by the index this tool prints" - removed
Input schema / properties / platform / titleRemoved value: -"Platform" - added
Input schema / properties / platform / typeAdded value: +[ + "integer", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"factory_floorsArguments"
- Changed
factory_health17 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / factory / descriptionPrevious value: -"a label name, any selector, or 'all' for every named factory"New value: +"a factory name, one selector term, or 'all' for every named factory" - removed
Input schema / properties / factory / titleRemoved value: -"Factory" - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"factory_healthArguments"
- Changed
factory_map16 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / show / titleRemoved value: -"Show" - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"factory_mapArguments"
- Changed
factory_query20 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / factory / descriptionPrevious value: -"a label name, or any selector e.g. 'proposal:3'"New value: +"a factory name or one selector term, e.g. proposal:3" - removed
Input schema / properties / factory / titleRemoved value: -"Factory" - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / ofRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write show= instead", - "title": "Of" -} - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / show / descriptionPrevious value: -"comma-separated: summary, machines, recipes, buildings, balance, inputs, outputs, internal, power, nodes, links, issues"New value: +"comma-separated: summary (size, position, top recipes, net power) | machines (building, recipe, clock) | recipes | buildings | balance (per item produced, consumed, net) | inputs (net deficit, fed from outside) | outputs (net surplus) | internal (made and eaten inside) | power (draw vs generation) | nodes (under its extractors) | links (material exchanged with other factories) | issues (paused, recipe-less, unresolved)" - removed
Input schema / properties / show / titleRemoved value: -"Show" - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"factory_queryArguments"
- Changed
factory_sites15 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"factory_sitesArguments"
- Removed
forget_factory - Removed
forget_plan - Added
hard_drives - Added
import_plan - Added
inventory - Changed
list_buildings17 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / building_kind / titleRemoved value: -"Building Kind" - removed
Input schema / properties / kindRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write building_kind= instead", - "title": "Kind" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"list_buildingsArguments"
- Changed
list_factories11 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"list_factoriesArguments"
- Removed
list_pending_hard_drive_choices - Removed
list_plans - Changed
list_regions5 fields changed- removed
Input schema / properties / resource / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / resource / titleRemoved value: -"Resource" - added
Input schema / properties / resource / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / with_resourceRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write resource= instead", - "title": "With Resource" -} - removed
Input schema / titleRemoved value: -"list_regionsArguments"
- Changed
list_worlds3 fields changed- added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / worldAdded value: +{ + "default": null, + "type": [ + "string", + "null" + ] +} - removed
Input schema / titleRemoved value: -"list_worldsArguments"
- Removed
mam_research - Removed
milestones - Removed
name_factory - Changed
phase_requirements11 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"phase_requirementsArguments"
- Changed
plan_factory106 fields changed- removed
Input schema / properties / allow_sinks / titleRemoved value: -"Allow Sinks" - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / base_rev / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / base_rev / titleRemoved value: -"Base Rev" - added
Input schema / properties / base_rev / typeAdded value: +[ + "integer", + "null" +] - removed
Input schema / properties / clocks / anyOfRemoved value: -[ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / clocks / descriptionAdded value: +"clock options for production rows, e.g. [0.5, 1.0]; omit = 1.0" - added
Input schema / properties / clocks / itemsAdded value: +{ + "type": "number" +} - removed
Input schema / properties / clocks / titleRemoved value: -"Clocks" - added
Input schema / properties / clocks / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / exclude_recipes / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / exclude_recipes / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / exclude_recipes / titleRemoved value: -"Exclude Recipes" - added
Input schema / properties / exclude_recipes / typeAdded value: +[ + "array", + "null" +] - added
Input schema / properties / export_minimums / additionalPropertiesAdded value: +{ + "type": "number" +} - removed
Input schema / properties / export_minimums / anyOfRemoved value: -[ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } -] - added
Input schema / properties / export_minimums / descriptionAdded value: +"{item: per-minute} minimum exports; the 'rate' request" - removed
Input schema / properties / export_minimums / titleRemoved value: -"Export Minimums" - added
Input schema / properties / export_minimums / typeAdded value: +[ + "object", + "null" +] - removed
Input schema / properties / exports / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / exports / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / exports / titleRemoved value: -"Exports" - added
Input schema / properties / exports / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / extractor_clocks / anyOfRemoved value: -[ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / extractor_clocks / descriptionAdded value: +"clock options for source nodes, e.g. [1.0, 1.5, 2.0, 2.5]" - added
Input schema / properties / extractor_clocks / itemsAdded value: +{ + "type": "number" +} - removed
Input schema / properties / extractor_clocks / titleRemoved value: -"Extractor Clocks" - added
Input schema / properties / extractor_clocks / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / for_factory / titleRemoved value: -"For Factory" - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / logistics_items / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / logistics_items / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / logistics_items / titleRemoved value: -"Logistics Items" - added
Input schema / properties / logistics_items / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / machine_cost_mw / titleRemoved value: -"Machine Cost Mw" - removed
Input schema / properties / objective / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / objective / titleRemoved value: -"Objective" - added
Input schema / properties / objective / typeAdded value: +[ + "string", + "null" +] - added
Input schema / properties / only_free_nodes / descriptionAdded value: +"skip nodes an extractor already taps" - removed
Input schema / properties / only_free_nodes / titleRemoved value: -"Only Free Nodes" - removed
Input schema / properties / only_recipes / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / only_recipes / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / only_recipes / titleRemoved value: -"Only Recipes" - added
Input schema / properties / only_recipes / typeAdded value: +[ + "array", + "null" +] - changed
Input schema / properties / overclock_last / descriptionPrevious value: -"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"New value: +"build each row one machine short, the last overclocked (1-2 Power Shards, checked against shards in hand plus craftable from slugs); 'default' = shared setting" - removed
Input schema / properties / overclock_last / titleRemoved value: -"Overclock Last" - added
Input schema / properties / overflowAdded value: +{ + "anyOf": [ + { + "enum": [ + "export", + "sink" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "'sink': minimums exports omits are sunk, power from the grid" +} - changed
Input schema / properties / payback_hours / descriptionPrevious value: -"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"New value: +"hours of play in which slower extra machines must repay their build points in saved power; 0 = plain build; stops 1, 2, 5, 10, 20, 50, 100; from 5 h, max_mw and min_power price machines at build points instead of machine_cost_mw; 'default' = shared setting" - removed
Input schema / properties / payback_hours / titleRemoved value: -"Payback Hours" - removed
Input schema / properties / plan / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / plan / descriptionPrevious value: -"recall a saved plan by name"New value: +"recall a saved plan (name or pin:N); other arguments override this call only" - removed
Input schema / properties / plan / titleRemoved value: -"Plan" - added
Input schema / properties / plan / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / plan_notes_text / titleRemoved value: -"Plan Notes Text" - changed
Input schema / properties / power_price / descriptionPrevious value: -"points per MWh the horizon prices power at; omit for the save's grid mix, 'default' puts a stored plan back on it"New value: +"points per MWh for payback pricing; omit = the save's grid mix; 'default' resets a saved plan to it" - removed
Input schema / properties / power_price / titleRemoved value: -"Power Price" - removed
Input schema / properties / recycle_once / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / recycle_once / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / recycle_once / titleRemoved value: -"Recycle Once" - added
Input schema / properties / recycle_once / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / required / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / required / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / required / titleRemoved value: -"Required" - added
Input schema / properties / required / typeAdded value: +[ + "array", + "null" +] - added
Input schema / properties / row_overclock / additionalPropertiesAdded value: +{ + "enum": [ + "last", + "spread", + "default" + ], + "type": "string" +} - removed
Input schema / properties / row_overclock / anyOfRemoved value: -[ - { - "additionalProperties": { - "enum": [ - "last", - "spread", - "default" - ], - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } -] - changed
Input schema / properties / row_overclock / descriptionPrevious value: -"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"New value: +"per recipe (exact name or class id): 'last' overclocks the row's last machine, 'spread' adds one underclocked machine, 'default' follows overclock_last; unnamed rows keep their stored choice" - removed
Input schema / properties / row_overclock / titleRemoved value: -"Row Overclock" - added
Input schema / properties / row_overclock / typeAdded value: +[ + "object", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / save_as / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save_as / titleRemoved value: -"Save As" - added
Input schema / properties / save_as / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / site_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / site_at / descriptionPrevious value: -"with save_as: record where this plan will STAND -- 'x,y[,z]' in metres, 'me', a factory name, 'slab:<n>' or a run id (the footprint's centre)"New value: +"with save_as: where the plan stands (footprint centre): 'x,y[,z]' in metres, 'me', a factory name, 'slab:<n>', 'chain:<n>'/'pipe:<n>'" - removed
Input schema / properties / site_at / titleRemoved value: -"Site At" - added
Input schema / properties / site_at / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / site_footprint / descriptionPrevious value: -"site footprint 'WxD' in metres; blank = the layout's own square"New value: +"'WxD' in metres; blank = the layout's own square" - removed
Input schema / properties / site_footprint / titleRemoved value: -"Site Footprint" - removed
Input schema / properties / site_yaw_deg / titleRemoved value: -"Site Yaw Deg" - removed
Input schema / properties / sloops / titleRemoved value: -"Sloops" - removed
Input schema / properties / sources / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / sources / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / sources / titleRemoved value: -"Sources" - added
Input schema / properties / sources / typeAdded value: +[ + "array", + "null" +] - added
Input schema / properties / supplied / additionalPropertiesAdded value: +{ + "type": "number" +} - removed
Input schema / properties / supplied / anyOfRemoved value: -[ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / supplied / titleRemoved value: -"Supplied" - added
Input schema / properties / supplied / typeAdded value: +[ + "object", + "null" +] - removed
Input schema / properties / target_item / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / target_item / descriptionAdded value: +"the item max_item maximises" - removed
Input schema / properties / target_item / titleRemoved value: -"Target Item" - added
Input schema / properties / target_item / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / water_extractors / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / water_extractors / titleRemoved value: -"Water Extractors" - added
Input schema / properties / water_extractors / typeAdded value: +[ + "integer", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"plan_factoryArguments"
- Added
plan_from_factory - Changed
plan_layout54 fields changed- removed
Input schema / properties / allow_sinksRemoved value: -{ - "default": true, - "title": "Allow Sinks", - "type": "boolean" -} - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / belt_tier / descriptionPrevious value: -"belt tier name; blank = the fastest you have unlocked"New value: +"belt tier name; blank = fastest unlocked" - removed
Input schema / properties / belt_tier / titleRemoved value: -"Belt Tier" - removed
Input schema / properties / clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Clocks" -} - removed
Input schema / properties / detailRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write show= instead", - "title": "Detail" -} - removed
Input schema / properties / exclude_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exclude Recipes" -} - removed
Input schema / properties / export_minimumsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Export Minimums" -} - removed
Input schema / properties / exportsRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exports" -} - removed
Input schema / properties / extractor_clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Extractor Clocks" -} - removed
Input schema / properties / factory / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / factory / descriptionPrevious value: -"fit the layout against this factory's existing platform"New value: +"fit against this factory's existing platform" - removed
Input schema / properties / factory / titleRemoved value: -"Factory" - added
Input schema / properties / factory / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / machine_cost_mwRemoved value: -{ - "default": 5, - "title": "Machine Cost Mw", - "type": "number" -} - removed
Input schema / properties / max_floor_foundations / titleRemoved value: -"Max Floor Foundations" - removed
Input schema / properties / objectiveRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "omitted: min_raw_power with export_minimums, else max_mw", - "title": "Objective" -} - removed
Input schema / properties / only_free_nodesRemoved value: -{ - "default": false, - "title": "Only Free Nodes", - "type": "boolean" -} - removed
Input schema / properties / only_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Only Recipes" -} - removed
Input schema / properties / order_floors_by / titleRemoved value: -"Order Floors By" - removed
Input schema / properties / overclock_lastRemoved 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" -} - removed
Input schema / properties / payback_hoursRemoved 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" -} - changed
Input schema / properties / pipe_tier / descriptionPrevious value: -"pipe tier name; blank = the fastest you have unlocked"New value: +"pipe tier name; blank = fastest unlocked" - removed
Input schema / properties / pipe_tier / titleRemoved value: -"Pipe Tier" - removed
Input schema / properties / plan / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / plan / defaultRemoved value: -null - changed
Input schema / properties / plan / descriptionPrevious value: -"recall a saved plan by name"New value: +"a saved plan's name or pin:N, or the solve: handle plan_factory printed" - removed
Input schema / properties / plan / titleRemoved value: -"Plan" - added
Input schema / properties / plan / typeAdded value: +"string" - removed
Input schema / properties / power_priceRemoved 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" -} - removed
Input schema / properties / row_overclockRemoved 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" -} - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / show / titleRemoved value: -"Show" - added
Input schema / properties / sites / additionalPropertiesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / sites / anyOfRemoved value: -[ - { - "additionalProperties": { - "items": { - "type": "string" - }, - "type": "array" - }, - "type": "object" - }, - { - "type": "null" - } -] - changed
Input schema / properties / sites / descriptionPrevious 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" - removed
Input schema / properties / sites / titleRemoved value: -"Sites" - added
Input schema / properties / sites / typeAdded value: +[ + "object", + "null" +] - removed
Input schema / properties / sloopsRemoved value: -{ - "default": 0, - "description": "Somersloops the plan may spend; 0 spends none", - "title": "Sloops", - "type": "integer" -} - removed
Input schema / properties / sourcesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Sources" -} - removed
Input schema / properties / target_itemRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Target Item" -} - removed
Input schema / properties / water_extractorsRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "how many Water Extractors your site can actually hold", - "title": "Water Extractors" -} - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - added
Input schema / requiredAdded value: +[ + "plan" +] - removed
Input schema / titleRemoved value: -"plan_layoutArguments"
- Removed
plan_log - Added
plans - Changed
power_report14 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / biomass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / biomass / titleRemoved value: -"Biomass" - added
Input schema / properties / biomass / typeAdded value: +[ + "boolean", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"power_reportArguments"
- Removed
power_shards - Changed
propose_factories17 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / max_span_m / titleRemoved value: -"Max Span M" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / unnamed_only / titleRemoved value: -"Unnamed Only" - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"propose_factoriesArguments"
- Changed
rank_build_sites19 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / resource / titleRemoved value: -"Resource" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / sources / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / sources / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / sources / titleRemoved value: -"Sources" - added
Input schema / properties / sources / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / topRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "deprecated alias for limit", - "title": "Top" -} - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"rank_build_sitesArguments"
- Changed
rank_unlocks37 fields changed- removed
Input schema / properties / allow_sinksRemoved value: -{ - "default": true, - "title": "Allow Sinks", - "type": "boolean" -} - removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Clocks" -} - removed
Input schema / properties / exclude_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exclude Recipes" -} - removed
Input schema / properties / export_minimumsRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Export Minimums" -} - removed
Input schema / properties / exportsRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Exports" -} - removed
Input schema / properties / extractor_clocksRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Extractor Clocks" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / machine_cost_mwRemoved value: -{ - "default": 5, - "title": "Machine Cost Mw", - "type": "number" -} - removed
Input schema / properties / objectiveRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "omitted: min_raw_power with export_minimums, else max_mw", - "title": "Objective" -} - removed
Input schema / properties / only_free_nodesRemoved value: -{ - "default": false, - "title": "Only Free Nodes", - "type": "boolean" -} - removed
Input schema / properties / only_recipesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Only Recipes" -} - removed
Input schema / properties / plan / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / plan / defaultRemoved value: -null - changed
Input schema / properties / plan / descriptionPrevious value: -"recall a saved plan by name"New value: +"a saved plan's name or pin:N, or the solve: handle plan_factory printed" - removed
Input schema / properties / plan / titleRemoved value: -"Plan" - added
Input schema / properties / plan / typeAdded value: +"string" - removed
Input schema / properties / query / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / query / titleRemoved value: -"Query" - added
Input schema / properties / query / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / searchRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write query= instead", - "title": "Search" -} - removed
Input schema / properties / sloopsRemoved value: -{ - "default": 0, - "title": "Sloops", - "type": "integer" -} - removed
Input schema / properties / sourcesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Sources" -} - removed
Input schema / properties / target_itemRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Target Item" -} - removed
Input schema / properties / water_extractorsRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Water Extractors" -} - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - added
Input schema / requiredAdded value: +[ + "plan" +] - removed
Input schema / titleRemoved value: -"rank_unlocksArguments"
- Changed
recipe_detail6 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "default": null, + "description": "pin to one save: the sav:… token an earlier answer printed", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / recipe_id / descriptionAdded value: +"class id or display name" - removed
Input schema / properties / recipe_id / titleRemoved value: -"Recipe Id" - added
Input schema / properties / saveAdded value: +{ + "default": null, + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / worldAdded value: +{ + "default": null, + "type": [ + "string", + "null" + ] +} - removed
Input schema / titleRemoved value: -"recipe_detailArguments"
- Removed
rename_factory - Removed
rename_plan - Added
research - Changed
search_conduits35 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / conduit_kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / conduit_kind / titleRemoved value: -"Conduit Kind" - added
Input schema / properties / conduit_kind / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / kindRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write conduit_kind= instead", - "title": "Kind" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / near / descriptionPrevious value: -"centre: 'x,y' in metres, 'me', a named factory, or a run id from this tool ('chain:7', 'pipe:333')"New value: +"centre: 'x,y' in metres, 'me', a factory name, or a run id from this tool ('chain:7', 'pipe:333')" - removed
Input schema / properties / near / titleRemoved value: -"Near" - removed
Input schema / properties / network / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / network / descriptionPrevious value: -"list every pipe of this fluid network (show=networks ids)"New value: +"list every pipe of this fluid network (ids from show=networks)" - removed
Input schema / properties / network / titleRemoved value: -"Network" - added
Input schema / properties / network / typeAdded value: +[ + "integer", + "null" +] - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / radius_m / titleRemoved value: -"Radius M" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / show / titleRemoved value: -"Show" - removed
Input schema / properties / to / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / to / descriptionPrevious value: -"second area: list only runs passing near BOTH, same forms as near"New value: +"second area: only runs passing near BOTH; same forms as near" - removed
Input schema / properties / to / titleRemoved value: -"To" - added
Input schema / properties / to / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / to_radius_m / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - changed
Input schema / properties / to_radius_m / descriptionPrevious value: -"radius around `to`, defaults to radius_m"New value: +"radius around `to`; defaults to radius_m" - removed
Input schema / properties / to_radius_m / titleRemoved value: -"To Radius M" - added
Input schema / properties / to_radius_m / typeAdded value: +[ + "number", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"search_conduitsArguments"
- Changed
search_items6 fields changed- removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"search_itemsArguments"
- Changed
search_recipes27 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / consumes / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / consumes / titleRemoved value: -"Consumes" - added
Input schema / properties / consumes / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / include_events / titleRemoved value: -"Include Events" - removed
Input schema / properties / kindRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write recipe_kind= instead", - "title": "Kind" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / only_alternates / titleRemoved value: -"Only Alternates" - removed
Input schema / properties / produces / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / produces / titleRemoved value: -"Produces" - added
Input schema / properties / produces / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Input schema / properties / recipe_kind / descriptionPrevious value: -"part | building | manual | all"New value: +"part | building (build-gun costs) | manual | all" - removed
Input schema / properties / recipe_kind / titleRemoved value: -"Recipe Kind" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"search_recipesArguments"
- Changed
search_resource_nodes39 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / groupRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write show= instead", - "title": "Group" -} - removed
Input schema / properties / kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / kind / titleRemoved value: -"Kind" - added
Input schema / properties / kind / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / modeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "retired -- write show= instead", - "title": "Mode" -} - removed
Input schema / properties / near / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / near / descriptionPrevious value: -"origin for show=nearest: 'x,y' in metres, 'me', or a factory name"New value: +"'x,y' (m), 'me' or a factory; @<radius_m> keeps what is within; show=nearest needs it; adds distances" - removed
Input schema / properties / near / titleRemoved value: -"Near" - added
Input schema / properties / near / typeAdded value: +[ + "string", + "null" +] - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / only_free / titleRemoved value: -"Only Free" - removed
Input schema / properties / purity / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / purity / titleRemoved value: -"Purity" - added
Input schema / properties / purity / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / resource / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / resource / titleRemoved value: -"Resource" - added
Input schema / properties / resource / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / show / titleRemoved value: -"Show" - removed
Input schema / properties / sources / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / sources / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / sources / titleRemoved value: -"Sources" - added
Input schema / properties / sources / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / status / titleRemoved value: -"Status" - added
Input schema / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"search_resource_nodesArguments"
- Changed
select_machines15 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / expand / titleRemoved value: -"Expand" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / select / descriptionPrevious value: -"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | pin:<n> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"New value: +"selector terms: product:<item> | recipe:<name> | building:<name or class> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | pin:<n> | all. Terms are ANDed; commas inside one term OR; a leading '-' excludes" - removed
Input schema / properties / select / titleRemoved value: -"Select" - removed
Input schema / properties / split / titleRemoved value: -"Split" - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"select_machinesArguments"
- Changed
settings6 fields changed- added
Input schema / properties / change / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "null" + } + ] +} - removed
Input schema / properties / change / anyOfRemoved value: -[ - { - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "boolean" - }, - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "type": "object" - }, - { - "type": "null" - } -] - changed
Input schema / properties / change / descriptionPrevious value: -"settings to change, e.g. {\"stage_headroom\": \"nameplate\"}; null resets"New value: +"settings to change, e.g. {\"stage_headroom\": \"nameplate\"}; null resets one" - removed
Input schema / properties / change / titleRemoved value: -"Change" - added
Input schema / properties / change / typeAdded value: +[ + "object", + "null" +] - removed
Input schema / titleRemoved value: -"settingsArguments"
- Added
share_plan - Changed
show_on_map24 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / at / descriptionPrevious value: -"any place -- 'x,y' in metres, 'me', a factory label, 'node:<id>', 'machine:<id>', 'slab:<n>', 'chain:<n>'/'pipe:<n>', 'plan:<name>' -- or 'resource:Crude Oil' for every node of one resource"New value: +"a place: 'x,y' in metres, 'me', a factory name, 'node:<id>', 'machine:<instance>', 'slab:<n>', 'chain:<n>'/'pipe:<n>', 'plan:<name>', 'pin:<n>'; or 'resource:<name>' for every node of one resource" - removed
Input schema / properties / at / titleRemoved value: -"At" - removed
Input schema / properties / layers / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - changed
Input schema / properties / layers / descriptionPrevious value: -"explicit sublayer tokens, overriding the guess"New value: +"public-map layer tokens; a pickup group also shows locally" - added
Input schema / properties / layers / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / layers / titleRemoved value: -"Layers" - added
Input schema / properties / layers / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / mode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / mode / descriptionPrevious value: -"base map type for the local link, an id settings() lists, or plain"New value: +"base map for the local link: an id settings() lists, or plain" - removed
Input schema / properties / mode / titleRemoved value: -"Mode" - added
Input schema / properties / mode / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / pin / titleRemoved value: -"Pin" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / zoom / titleRemoved value: -"Zoom" - removed
Input schema / titleRemoved value: -"show_on_mapArguments"
- Changed
site_plan26 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / at / descriptionPrevious value: -"site origin (the footprint's CENTRE): 'x,y[,z]' in metres, 'me', a factory name, 'slab:<n>' or a run id. Blank keeps the stored origin"New value: +"origin (footprint centre): 'x,y[,z]' in metres, 'me', a factory name, 'slab:<n>', 'chain:<n>'/'pipe:<n>'; blank keeps the stored one" - removed
Input schema / properties / at / titleRemoved value: -"At" - removed
Input schema / properties / base_rev / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / base_rev / titleRemoved value: -"Base Rev" - added
Input schema / properties / base_rev / typeAdded value: +[ + "integer", + "null" +] - added
Input schema / properties / clear / descriptionAdded value: +"drop the siting; the plan itself stays" - removed
Input schema / properties / clear / titleRemoved value: -"Clear" - changed
Input schema / properties / footprint / descriptionPrevious value: -"'WxD' in metres ('96' = square). Blank keeps the stored one, or derives the layout's own square if none is stored"New value: +"'WxD' in metres ('96' = square); blank keeps the stored one, else the layout's square" - removed
Input schema / properties / footprint / titleRemoved value: -"Footprint" - added
Input schema / properties / plan / descriptionAdded value: +"the saved plan's name or pin:N" - removed
Input schema / properties / plan / titleRemoved value: -"Plan" - removed
Input schema / properties / preview / titleRemoved value: -"Preview" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / yaw_deg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Input schema / properties / yaw_deg / titleRemoved value: -"Yaw Deg" - added
Input schema / properties / yaw_deg / typeAdded value: +[ + "number", + "null" +] - removed
Input schema / titleRemoved value: -"site_planArguments"
- Removed
somersloops - Removed
stock - Removed
storage - Changed
trace_upstream16 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / direction / titleRemoved value: -"Direction" - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / seed / descriptionPrevious value: -"a machine instance, a factory label, or a building name"New value: +"machine:<instance> (or the bare instance), a factory name, or a building name" - removed
Input schema / properties / seed / titleRemoved value: -"Seed" - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"trace_upstreamArguments"
- Changed
ui_context16 fields changed- removed
Input schema / properties / answered / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - changed
Input schema / properties / answered / descriptionPrevious value: -"ask:N ids you have answered, each may add a line: \"ask:7 <answer>\""New value: +"ask:N ids you answered; \"ask:7 <answer>\" adds a line" - added
Input schema / properties / answered / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / answered / titleRemoved value: -"Answered" - added
Input schema / properties / answered / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / dismissed / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / dismissed / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / dismissed / titleRemoved value: -"Dismissed" - added
Input schema / properties / dismissed / typeAdded value: +[ + "array", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"ui_contextArguments"
- Changed
unlocked_recipes16 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / offset / minimumAdded value: +0 - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / only_alternates / titleRemoved value: -"Only Alternates" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"unlocked_recipesArguments"
- Changed
whereami14 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / limit / descriptionRemoved value: -"max rows (hard cap 25)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / radius_m / titleRemoved value: -"Radius M" - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"whereamiArguments"
- Changed
world_summary14 fields changed- removed
Input schema / properties / as_of / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / as_of / descriptionPrevious 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" - removed
Input schema / properties / as_of / titleRemoved value: -"As Of" - added
Input schema / properties / as_of / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / biomass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / biomass / titleRemoved value: -"Biomass" - added
Input schema / properties / biomass / typeAdded value: +[ + "boolean", + "null" +] - removed
Input schema / properties / save / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save / titleRemoved value: -"Save" - added
Input schema / properties / save / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / world / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / world / titleRemoved value: -"World" - added
Input schema / properties / world / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"world_summaryArguments"
18 tool updates
v0.2.0- Changed
alternates_for_item1 field changed- added
Input schema / properties / planAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "a stored plan: add what requiring each recipe would change in it", + "title": "Plan" +}
- Changed
amend_factory1 field changed- changed
Input schema / properties / add / descriptionPrevious value: -"selector terms for what to ADD. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"New value: +"selector terms for what to ADD. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | pin:<n> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"
- Changed
commission_plan5 fields changed- added
Input schema / properties / biomassAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "count hand-fed biomass burners as generation; omitted: the shared setting", + "title": "Biomass" +} - added
Input schema / properties / objective / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / objective / defaultPrevious value: -"max_mw"New value: +null - added
Input schema / properties / objective / descriptionAdded value: +"omitted: min_raw_power with export_minimums, else max_mw" - removed
Input schema / properties / objective / typeRemoved value: -"string"
- Changed
diff_vs_save6 fields changed- added
Input schema / properties / biomassAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "count hand-fed biomass burners as generation; omitted: the shared setting", + "title": "Biomass" +} - changed
Input schema / properties / factory / descriptionPrevious value: -"only count this factory's machines as already built"New value: +"count this factory as built; also 'auto', 'world' or 'none'" - added
Input schema / properties / objective / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / objective / defaultPrevious value: -"max_mw"New value: +null - added
Input schema / properties / objective / descriptionAdded value: +"omitted: min_raw_power with export_minimums, else max_mw" - removed
Input schema / properties / objective / typeRemoved value: -"string"
- Changed
explain_byproducts5 fields changed- added
Input schema / properties / objective / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / objective / defaultPrevious value: -"max_mw"New value: +null - added
Input schema / properties / objective / descriptionAdded value: +"omitted: min_raw_power with export_minimums, else max_mw" - removed
Input schema / properties / objective / typeRemoved value: -"string" - added
Input schema / properties / only_free_nodesAdded value: +{ + "default": false, + "title": "Only Free Nodes", + "type": "boolean" +}
- Changed
name_factory1 field changed- changed
Input schema / properties / select / descriptionPrevious value: -"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"New value: +"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | pin:<n> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"
- Changed
plan_factory9 fields changed- changed
Input schema / properties / for_factory / descriptionPrevious value: -"factory label this plan is for"New value: +"factory this plan is built at; also 'auto', 'whole world', 'none'" - added
Input schema / properties / objective / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / objective / defaultPrevious value: -"max_mw"New value: +null - added
Input schema / properties / objective / descriptionAdded value: +"omitted: min_raw_power with export_minimums, else max_mw" - removed
Input schema / properties / objective / typeRemoved value: -"string" - added
Input schema / properties / overclock_lastAdded 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" +} - added
Input schema / properties / payback_hoursAdded 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" +} - added
Input schema / properties / power_priceAdded 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" +} - added
Input schema / properties / row_overclockAdded 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" +}
- Changed
plan_layout8 fields changed- added
Input schema / properties / objective / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / objective / defaultPrevious value: -"max_mw"New value: +null - added
Input schema / properties / objective / descriptionAdded value: +"omitted: min_raw_power with export_minimums, else max_mw" - removed
Input schema / properties / objective / typeRemoved value: -"string" - added
Input schema / properties / overclock_lastAdded 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" +} - added
Input schema / properties / payback_hoursAdded 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" +} - added
Input schema / properties / power_priceAdded 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" +} - added
Input schema / properties / row_overclockAdded 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" +}
- Changed
power_report1 field changed- added
Input schema / properties / biomassAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "count hand-fed biomass burners as generation; omitted: the shared setting", + "title": "Biomass" +}
- Changed
rank_unlocks4 fields changed- added
Input schema / properties / objective / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / objective / defaultPrevious value: -"max_mw"New value: +null - added
Input schema / properties / objective / descriptionAdded value: +"omitted: min_raw_power with export_minimums, else max_mw" - removed
Input schema / properties / objective / typeRemoved value: -"string"
- Changed
search_conduits1 field changed- added
Input schema / properties / networkAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "list every pipe of this fluid network (show=networks ids)", + "title": "Network" +}
- Changed
search_resource_nodes1 field changed- added
Input schema / properties / statusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "free | tapped | all; only_free=true means free", + "title": "Status" +}
- Changed
select_machines1 field changed- changed
Input schema / properties / select / descriptionPrevious value: -"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"New value: +"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | pin:<n> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"
- Added
settings - Changed
show_on_map3 fields changed- changed
Input schema / properties / at / descriptionPrevious value: -"any place -- 'x,y' in metres, 'me', a factory label, 'node:<id>', 'slab:<n>', 'chain:<n>'/'pipe:<n>', 'plan:<name>' -- or 'resource:Crude Oil' for every node of one resource"New value: +"any place -- 'x,y' in metres, 'me', a factory label, 'node:<id>', 'machine:<id>', 'slab:<n>', 'chain:<n>'/'pipe:<n>', 'plan:<name>' -- or 'resource:Crude Oil' for every node of one resource" - added
Input schema / properties / modeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "base map type for the local link, an id settings() lists, or plain", + "title": "Mode" +} - added
Input schema / properties / pinAdded value: +{ + "default": false, + "description": "also pin it on the page (pin:N)", + "title": "Pin", + "type": "boolean" +}
- Changed
site_plan1 field changed- added
Input schema / properties / previewAdded value: +{ + "default": false, + "description": "show what the pad would meet there; writes nothing", + "title": "Preview", + "type": "boolean" +}
- Changed
ui_context2 fields changed- added
Input schema / properties / answeredAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ask:N ids you have answered, each may add a line: \"ask:7 <answer>\"", + "title": "Answered" +} - added
Input schema / properties / dismissedAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "adv: ids to hide on the page; \"adv:3f9a snooze\" hides for 1 h of play", + "title": "Dismissed" +}
- Changed
world_summary1 field changed- added
Input schema / properties / biomassAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "count hand-fed biomass burners as generation; omitted: the shared setting", + "title": "Biomass" +}
51 tool updates
- Changed
advise_hard_drive_pick1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Changed
alternates_for_item2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / worldAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "World" +}
- Added
amend_factory - Changed
bom2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
collected_from_world8 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / mode / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / mode / defaultPrevious value: -"census"New value: +null - changed
Input schema / properties / mode / descriptionPrevious value: -"census | collected | remaining | nearest"New value: +"retired -- write show= instead" - removed
Input schema / properties / mode / typeRemoved value: -"string" - changed
Input schema / properties / near / descriptionPrevious value: -"origin for mode=nearest: 'x,y' in metres, 'me', or a factory name. Defaults to where the player is standing"New value: +"origin for show=nearest: 'x,y' in metres, 'me', or a factory name. Defaults to where the player is standing" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +} - added
Input schema / properties / showAdded value: +{ + "default": "census", + "description": "census | collected | remaining | nearest", + "title": "Show", + "type": "string" +}
- Changed
commission_plan3 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - changed
Input schema / properties / limit / defaultPrevious value: -60New value: +25 - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
compare_recipe_options1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Added
crates - Changed
describe_location5 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / atAdded value: +{ + "default": "", + "description": "the place: 'x,y' in metres, 'me', a named factory, 'slab:<n>', or a run id like 'chain:7'", + "title": "At", + "type": "string" +} - removed
Input schema / properties / x_mRemoved value: -{ - "title": "X M", - "type": "number" -} - removed
Input schema / properties / y_mRemoved value: -{ - "title": "Y M", - "type": "number" -} - removed
Input schema / requiredRemoved value: -[ - "x_m", - "y_m" -]
- Changed
diff_vs_save1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Changed
explain_byproducts1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Added
factory_floors - Changed
factory_health2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
factory_map2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
factory_query7 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / of / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / of / defaultPrevious value: -"summary"New value: +null - changed
Input schema / properties / of / descriptionPrevious value: -"comma-separated: summary, machines, recipes, buildings, balance, inputs, outputs, power, nodes, links, issues"New value: +"retired -- write show= instead" - removed
Input schema / properties / of / typeRemoved value: -"string" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +} - added
Input schema / properties / showAdded value: +{ + "default": "summary", + "description": "comma-separated: summary, machines, recipes, buildings, balance, inputs, outputs, internal, power, nodes, links, issues", + "title": "Show", + "type": "string" +}
- Changed
factory_sites2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
forget_factory1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Changed
forget_plan2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / base_revAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "the plan version you read; needed to change an existing plan", + "title": "Base Rev" +}
- Changed
list_buildings8 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / building_kindAdded value: +{ + "default": "production", + "description": "production | extractor | generator | logistics | foundation | ramp | wall | pillar | beam | architecture | all", + "title": "Building Kind", + "type": "string" +} - added
Input schema / properties / kind / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / kind / defaultPrevious value: -"production"New value: +null - added
Input schema / properties / kind / descriptionAdded value: +"retired -- write building_kind= instead" - removed
Input schema / properties / kind / typeRemoved value: -"string" - added
Input schema / properties / limitAdded value: +{ + "default": 25, + "description": "max rows (hard cap 25)", + "maximum": 25, + "minimum": 1, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
list_factories1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Changed
list_pending_hard_drive_choices3 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / limitAdded value: +{ + "default": 25, + "description": "max rows (hard cap 25)", + "maximum": 25, + "minimum": 1, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
list_plans2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "one plan's full stored request, siting and field, unsolved", + "title": "Name" +}
- Changed
list_regions2 fields changed- added
Input schema / properties / resourceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Resource" +} - added
Input schema / properties / with_resource / descriptionAdded value: +"retired -- write resource= instead"
- Changed
mam_research9 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +} - added
Input schema / properties / queryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "filter by name, case-insensitive", + "title": "Query" +} - changed
Input schema / properties / search / descriptionPrevious value: -"filter by name, case-insensitive"New value: +"retired -- write query= instead" - added
Input schema / properties / showAdded value: +{ + "default": "todo", + "description": "all | todo | affordable -- todo hides finished research", + "title": "Show", + "type": "string" +} - added
Input schema / properties / status / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / status / defaultPrevious value: -"todo"New value: +null - changed
Input schema / properties / status / descriptionPrevious value: -"all | todo | affordable -- todo hides finished research"New value: +"retired -- write show= instead" - removed
Input schema / properties / status / typeRemoved value: -"string"
- Added
milestones - Changed
name_factory2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - changed
Input schema / properties / select / descriptionPrevious value: -"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<x,y@radius_m or label@radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"New value: +"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"
- Changed
phase_requirements1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Changed
plan_factory6 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / base_revAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "the plan version you read; needed to save over an existing plan", + "title": "Base Rev" +} - added
Input schema / properties / requiredAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "recipes that must make their item; others for it are excluded", + "title": "Required" +} - added
Input schema / properties / site_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "with save_as: record where this plan will STAND -- 'x,y[,z]' in metres, 'me', a factory name, 'slab:<n>' or a run id (the footprint's centre)", + "title": "Site At" +} - added
Input schema / properties / site_footprintAdded value: +{ + "default": "", + "description": "site footprint 'WxD' in metres; blank = the layout's own square", + "title": "Site Footprint", + "type": "string" +} - added
Input schema / properties / site_yaw_degAdded value: +{ + "default": 0, + "description": "site orientation: degrees about world Z, positive +X towards +Y", + "title": "Site Yaw Deg", + "type": "number" +}
- Changed
plan_layout7 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / detail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / detail / defaultPrevious value: -"floors"New value: +null - added
Input schema / properties / detail / descriptionAdded value: +"retired -- write show= instead" - removed
Input schema / properties / detail / typeRemoved value: -"string" - added
Input schema / properties / showAdded value: +{ + "default": "floors", + "description": "floors | blocks | buses | trunks | materials | sites", + "title": "Show", + "type": "string" +} - changed
Input schema / properties / sites / descriptionPrevious value: -"detail=\"sites\": {\"rig\": [\"Heavy Oil Residue\", ...], ...}"New value: +"show=\"sites\": {\"rig\": [\"Heavy Oil Residue\", ...], \"hall\": [\"MW\"]} -- MW/power claims every generator"
- Added
plan_log - Changed
power_report1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Changed
power_shards2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
propose_factories2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
rank_build_sites6 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / limitAdded value: +{ + "default": 5, + "description": "max rows (hard cap 25)", + "maximum": 25, + "minimum": 1, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / top / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / top / defaultPrevious value: -5New value: +null - added
Input schema / properties / top / descriptionAdded value: +"deprecated alias for limit" - removed
Input schema / properties / top / typeRemoved value: -"integer"
- Changed
rank_unlocks3 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / queryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "only test alternates whose name matches", + "title": "Query" +} - changed
Input schema / properties / search / descriptionPrevious value: -"only test alternates whose name matches"New value: +"retired -- write query= instead"
- Added
rename_factory - Added
rename_plan - Added
search_conduits - Changed
search_recipes7 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / kind / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / kind / defaultPrevious value: -"part"New value: +null - added
Input schema / properties / kind / descriptionAdded value: +"retired -- write recipe_kind= instead" - removed
Input schema / properties / kind / typeRemoved value: -"string" - added
Input schema / properties / recipe_kindAdded value: +{ + "default": "part", + "description": "part | building | manual | all", + "title": "Recipe Kind", + "type": "string" +} - added
Input schema / properties / worldAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "World" +}
- Changed
search_resource_nodes11 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - changed
Input schema / properties / group / descriptionPrevious value: -"deprecated alias for mode"New value: +"retired -- write show= instead" - added
Input schema / properties / kind / descriptionAdded value: +"node | well_sat | geyser | all" - added
Input schema / properties / mode / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / mode / defaultPrevious value: -"fields"New value: +null - changed
Input schema / properties / mode / descriptionPrevious value: -"fields | nodes | nearest"New value: +"retired -- write show= instead" - removed
Input schema / properties / mode / typeRemoved value: -"string" - changed
Input schema / properties / near / descriptionPrevious value: -"origin for mode=nearest: 'x,y' in metres, 'me', or a factory name"New value: +"origin for show=nearest: 'x,y' in metres, 'me', or a factory name" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +} - added
Input schema / properties / purity / descriptionAdded value: +"pure | normal | impure | all" - added
Input schema / properties / showAdded value: +{ + "default": "fields", + "description": "fields | nodes | nearest", + "title": "Show", + "type": "string" +}
- Changed
select_machines2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - changed
Input schema / properties / select / descriptionPrevious value: -"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<x,y@radius_m or label@radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"New value: +"selector terms, ANDed. product:<item> | recipe:<name> | building:<class or name> | near:<place>@<radius_m> | base:<n> | line:<n> | slab:<n> | proposal:<n> | label:<name> | machine:<instance> | all. Terms are ANDed; comma-separated values inside one term are ORed; prefix a term with '-' to exclude it"
- Changed
show_on_map4 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / atAdded value: +{ + "description": "any place -- 'x,y' in metres, 'me', a factory label, 'node:<id>', 'slab:<n>', 'chain:<n>'/'pipe:<n>', 'plan:<name>' -- or 'resource:Crude Oil' for every node of one resource", + "title": "At", + "type": "string" +} - removed
Input schema / properties / targetRemoved value: -{ - "description": "'x,y' in metres, 'me', a factory label, a node id, or a resource name like 'Crude Oil'", - "title": "Target", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "target" -]New value: +[ + "at" +]
- Added
site_plan - Changed
somersloops3 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / limitAdded value: +{ + "default": 20, + "description": "max rows (hard cap 25)", + "maximum": 25, + "minimum": 1, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Added
stock - Added
storage - Changed
trace_upstream1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Added
ui_context - Changed
unlocked_recipes2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Changed
whereami1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
- Changed
world_summary1 field changed- added
Input schema / properties / as_ofAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "pin to one world state: a sav:… token from an earlier answer", + "title": "As Of" +}
42 tool updates
v0.1.0- First observed
advise_hard_drive_pick - First observed
alternates_for_item - First observed
bom - First observed
collected_from_world - First observed
commission_plan - First observed
compare_recipe_options - First observed
describe_location - First observed
diff_vs_save - First observed
explain_byproducts - First observed
factory_health - First observed
factory_map - First observed
factory_query - First observed
factory_sites - First observed
forget_factory - First observed
forget_plan - First observed
list_buildings - First observed
list_factories - First observed
list_pending_hard_drive_choices - First observed
list_plans - First observed
list_regions - First observed
list_worlds - First observed
mam_research - First observed
name_factory - First observed
phase_requirements - First observed
plan_factory - First observed
plan_layout - First observed
power_report - First observed
power_shards - First observed
propose_factories - First observed
rank_build_sites - First observed
rank_unlocks - First observed
recipe_detail - First observed
search_items - First observed
search_recipes - First observed
search_resource_nodes - First observed
select_machines - First observed
show_on_map - First observed
somersloops - First observed
trace_upstream - First observed
unlocked_recipes - First observed
whereami - First observed
world_summary
TDQS
Scored across 49 tools
Most tools are clearly differentiated by detailed descriptions, but several related clusters blur at the edges, e.g. factory_map/propose_factories/factory_sites and plan_factory/plan_from_factory/plans. An expert agent can usually select correctly after reading, but the cognitive load is high enough to risk occasional misselection.
All tool names consistently use snake_case and are readable. The convention is not strictly verb_noun throughout, since noun-only tools like inventory, crates, plans, and bom mix with verb-led names, but the deviations are minor.
At 49 tools, the surface is far above the 3-15 well-scoped range and squarely in the rubric's 25+ 'too many' band. Even for a deep Satisfactory planning domain, this many tools create significant selection overhead and should be consolidated into narrower groups.
Coverage is broad across planning, factories, recipes, resources, inventory, research, power, and map views, with few obvious dead ends for core workflows. Minor gaps remain around vehicle/train logistics and direct build/dismantle actions, but the main domain lifecycle is well supported.
Maintenance
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for generating rough-draft project plans from natural-language prompts.
An MCP server for deep research or task groups
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server for managing recipes, meal plans, shopping lists, and more through a self-hosted Mealie instance.1MIT
- AlicenseNot gradedqualityDmaintenanceAn external MCP server for diagnosing Minecraft servers via backup analysis, local runtime, or Docker runtime, offering tools for plugin inspection, log analysis, configuration linting, and performance diagnostics.1MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server providing tools for YouTube search, AI trip planning, notes management, web search, and product price comparison, backed by a FastAPI backend.-
- AlicenseNot gradedqualityDmaintenanceMCP server for Minecraft that manages map points, provides recipes and guides, and enables inspection/download of files and worlds via the exaroton REST API.MIT
A power plant up close: machines, belts, pipes, wires
The terrain map, shaded from the game's heightfield