Artifact and index limits
For: tenant administrators and plugin authors.
Look up bundle, tool listing, startup, hub and index bounds.
The bundle
A plugin is packed into one bundle, the same format the edge builds from a Git commit, and every server reads it in memory to check it.
| Limit | Value | lint | pack | hub submit | install | What it says, for example |
|---|---|---|---|---|---|---|
| Packed size | 67,108,864 bytes (64 MiB) packed, gzipped | not checked | error | error | error | the plugin packs to 70 MB, more than the limit of 64 MB |
| Unpacked size | 536,870,912 bytes (512 MiB) unpacked | not checked | error | error | error | the bundle unpacks to more than 512 MB |
| Entries | 50,000 files and folders in a bundle | not checked | error | error | error | the bundle has more than 50000 entries |
| Files a check reads | 4,194,304 bytes (4 MiB) a file, 67,108,864 bytes (64 MiB) of them together | not checked | error | error | error | agents/big.yaml: is 5.2 MB; a file the manifest names may have at most 4 MB, and the plugin's checks did not read it |
files.count | 100,000 files and folders in the plugin's folder, outside .git, .venv, node_modules, __pycache__, .oz0-tools, dist, .pytest_cache and .ruff_cache | error | error | error | error | the plugin's folder holds more than 100000 files and folders (outside .git, .venv, …) |
A file over 4 MiB, or past 64 MiB of read files, is packed and installed but not read by the checks, which never read code. A file the manifest names (an agent, a schema, instructions, a skill, a flow, an eval) must be read, so one that large is an error. Packing leaves out version control, virtual environments, build output, caches, .env files and whatever .gitignore ignores.
The measured listing
| Limit | Value | lint | pack | hub submit | install | What it says, for example |
|---|---|---|---|---|---|---|
tools.listing.json | 4,194,304 bytes (4 MiB) | error | error | error | error | tools.listing.json: is 5000000 bytes, more than the limit of 4194304 |
The measured listing is what plugin test writes: each function your servers list, with its schemas. A listing that large usually means a server lists far more functions than one plugin should hold; split the plugin.
Tool-size and start-up budgets
Two budgets in estimated tokens keep what every model request carries small (the size budget, the start-up budget). A budget is yours to raise in the plugin's files, where every reviewer sees it, up to 1,000,000.
| Code | Limit | lint | pack | hub submit | install | What it says, for example |
|---|---|---|---|---|---|---|
tools.budget | Per agent: its tool definitions, limits.tool_tokens, 8,000 unless set. Per plugin: all its own functions, tool_tokens in oz0-plugin.yaml, 16,000 unless set | error | error | warning | not checked | agent clerk: its tool definitions come to about 2,386 tokens in every model request (an estimate), more than its budget of 2,000; the biggest: … |
tools.tokens | One function's definition, 1,500 | warning | not checked | not checked | not checked | function office.send_invoice's definition comes to about 1,620 tokens (an estimate; more than 1500) |
startup.budget | Per agent: the index of its skills and its tools' manuals in its start-up context, limits.startup_tokens, 4,000 unless set | error | error | warning | not checked | agent clerk: the index of its 12 skills comes to about 4,410 tokens in its start-up context (an estimate), more than its budget of 4,000; the biggest: … |
At hub submit a budget is a warning: the listing carries the figures, and its page shows them.
The listing
What you write about a plugin when you list it, and what the hub's page and search keep of it. Only hub submit checks these.
| Limit | Value | What happens past it |
|---|---|---|
| Summary | 500 characters | hub submit refuses it: "--summary is 612 characters, and a listing's summary is at most 500: say in one or two sentences what the plugin does". Without --summary the manifest's description stands in, and must fit too. |
| A tag | 1 to 32 lowercase letters, digits and dashes, starting with a letter or a digit | hub submit refuses it, and so does the listing file's schema. |
The hub's tags.yaml, max_per_listing; 8 when it sets none | hub submit --hub <checkout> refuses more, naming the number and where it comes from; the hub's checks refuse them on the pull request. | |
| Links | https:// links of at most 2,048 UTF-8 bytes: a homepage, issues, and a security contact, which may be mailto: | hub submit refuses another scheme. The Repository link is computed from the verified source, never written by you. |
| README excerpt | 2,000 characters of the README's first section | Cut, never refused. The hub's page shows the whole README; the excerpt is what oz0 hub search, the console's Install dialog and the hub's search cards show. |
| The graph | 1,000 parts and 2,000 links between them | The graph of the plugin's parts is cut and says so; nothing is refused. |
| SBOM in the listing | 500 package URLs | The listing names the first 500; the SBOM file holds them all. |
The hub's review caps
The hub reviews a plugin past its own caps instead of refusing it: a maintainer looks at what makes it that large. They are in the hub's hub.yaml, so another hub may set others.
| Limit | Value | What happens past it |
|---|---|---|
| Files | 2,000 files in a plugin | A finding on the pull request, which a maintainer reviews |
| Size | 25 MiB of files in a plugin | A finding on the pull request, which a maintainer reviews |
| One file | 5 MiB in one file | A finding on the pull request, which a maintainer reviews |
hub submit --check runs the hub's own checks, so it shows these findings before the pull request.
The signed index
| Limit | Value | What happens past it |
|---|---|---|
| Index size | 33,554,432 bytes (32 MiB), the signed envelope with its payload | A server refuses an index that large, and keeps the copy it has. index sign writes each version's full listing as a detail document beside the index and signs a compact entry, so tens of thousands of versions fit. |