Docs / Reference
Capabilities and presets
A capability is a named grant that says what kind of power an agent holds. This page lists every capability, the baseline every specialist gets, what the strict profile removes, and the presets each specialist and the main agent are built from.
What a capability is
A capability is one name, domain.grade, such as shell.full or git.commit. A preset declares a set of them, and ivralo attaches the tools that answer to each one. So "which tools does this specialist have" is one line of data.
A grant is never a bypass. Holding shell.full means a specialist carries the shell tool at all; the shell policy still judges every command. Capabilities decide what is attached; the tools decide what is permitted, and a person still approves what asks.
Each capability has three properties that matter in practice:
- Gate. Some are effective only while a setting supports them, such as a key being set or the workspace being a git repository. The write grades of Google and GitHub also need a person there to approve.
- Approval. Who says yes per use: nobody (
none), the shell policy's answer for that command (verdict), a person on each call who may lift it for the session (call), or a person on each call with no way to lift it (always). - Strict. Whether the
strictprofile removes it.
The registry
| Capability | What it allows | Gate | Approval | Strict |
|---|---|---|---|---|
python.run | Run Python in the workspace, in a worker process of its own. | - | none | keeps |
filesystem.read | Read files: the workspace, and anywhere the user can read. Only a .env file is refused. | - | none | keeps |
filesystem.write | Write files inside the workspace, through the write guard that keeps history. | - | none | keeps |
user.ask | Put a question to the person and wait for the answer. | - | none | keeps |
team.ask | Put one question to a colleague and get its answer back. The colleague only reads. | IVRALO_ASK_MEMBER | none | keeps |
team.run | Hand a job to a specialist: open a fresh instance of it and get its report back. The instance runs on that specialist's own grants. | IVRALO_INSTANCES above 0 | none | keeps |
database.read | Query your own databases, each by name, read-only. | IVRALO_SQL_URL or databases.json | none | cannot drop |
photos.fetch | Fetch a stock photo from Unsplash into the workspace. | IVRALO_UNSPLASH_ACCESS_KEY | none | cannot drop |
shell.full | Run a shell command in the workspace, judged by the shell policy. | - | verdict | drops |
index.search | Search the workspace's knowledge index and cite the place. | IVRALO_KNOWLEDGE | none | keeps |
network.web | Search the web, read a page and save one, with no API key. | IVRALO_WEB | none | drops |
mail.send | Send e-mail to the addresses you named. | IVRALO_MAIL | always | drops |
message.send | Post a short message to the configured Telegram or Slack chat. | IVRALO_TELEGRAM_BOT_TOKEN or IVRALO_SLACK_WEBHOOK_URL | always | drops |
google.read | Read your Google calendar, mail, Drive and Sheets. | IVRALO_GOOGLE_SERVICES | none | keeps |
google.write | Draft, create and update in Google Workspace; never send. Implies google.read. | IVRALO_GOOGLE_WRITE, and a person there | call | drops |
github.read | Read repositories, issues, pull requests and code on GitHub. | GITHUB_ACCESS_TOKEN | none | keeps |
github.write | Create and edit on GitHub; never delete a repository. Implies github.read. | IVRALO_GITHUB_WRITE, and a person there | call | drops |
code.read | Read the code of the repository the workspace is: files, an outline, a search. | a .git at the workspace root | none | keeps |
code.edit | Change a file by an exact replacement, inside the workspace, read first, each edit shown and approved. Implies code.read. | a .git at the workspace root | call | drops |
git.commit | Make a branch from HEAD, stage, commit, revert, restore a file; each call shown and approved. Never a push. Implies code.read. | a .git at the workspace root | call | drops |
git.push | Push a branch ivralo made and open a draft pull request for it. Never the default branch, a branch the remote already has, or a force push; never a merge. Implies code.read. | a .git at the workspace root, and ivralo's own identity in the home's gitconfig | always | drops |
incident.read | Read an evidence bundle and the repository's history into ivralo's own digest. Refused on a hosted model unless allowed. | - | none | keeps |
incident.report | File the incident report under .ivralo/incidents/, checked against the evidence. | - | none | keeps |
ivralo doctor prints this table, each specialist's grants as your configuration leaves them, and what the main agent holds.
The baseline
Every specialist gets eight capabilities without declaring them:
| Capability | Why it is in the baseline |
|---|---|
python.run | Every specialist works by running Python. |
filesystem.read, filesystem.write | The workspace is where the work is. |
user.ask | Any specialist may need to ask you something. |
team.ask | Any specialist may ask a colleague a question. |
team.run | Any agent may hand work to a specialist in a fresh context, which runs on that specialist's own grants and reports back. |
database.read, photos.fetch | The Python worker asks ivralo for both, so any specialist that runs Python reaches them. They are listed rather than hidden. |
A preset may give up baseline names. The Incident Investigator gives up Python, writing, asking a colleague, the databases and photos, so it carries no tool an instruction planted in the evidence could act through.
The strict profile
IVRALO_PROFILE=strict, or --profile strict on a command, takes away everything that reaches outside the workspace or changes your repository: shell.full, network.web, mail.send, message.send, google.write, github.write, code.edit, git.commit and git.push. MCP servers are not attached either. code.read stays, so a strict team still reads the code.
The profile is applied after implied grants are added, name by name, so dropping google.write keeps the google.read it implied. It only ever narrows. A specialist left with nothing to do leaves the team, as the Courier does under strict.
database.read and photos.fetch cannot be dropped yet, because they are part of the baseline.
Unattended runs and server mode
A run nobody attends, such as a pipe, a schedule, a job or an API request sent unattended, is granted nothing that would have to ask. The mode decides the exceptions:
IVRALO_MODE | Granted unattended |
|---|---|
developer (default) | Nothing that asks. |
server | git.commit and git.push: make a branch, stage and commit, push the branch ivralo made, open a draft pull request. Nothing merges. |
allow_tools in permissions.json lifts named edit and git tools for unattended runs too. See Server mode.
Presets
A preset is what a specialist is built from: a key, a display name, the capabilities it holds beyond the baseline, one sentence on what it is for, and a tool-call limit. It has no prompt of its own. Every specialist is built with the whole skill shelf; the skills it owns come first and are where /skill <name> sends a request.
| Key | Name | Beyond the baseline | Owns these skills | Tool calls |
|---|---|---|---|---|
analyst | Data Analyst | - | analysis, xlsx | 20 |
spreadsheet | Spreadsheet Builder | - | xlsx, analysis | 20 |
visualizer | Chart Designer | - | charts, analysis | 20 |
reporter | Report Writer | shell.full | pdf-generate, charts, unicode, photos | 20 |
scribe | Document and Deck Writer | shell.full | docx, pptx, unicode, photos | 20 |
librarian | Librarian | index.search, network.web | documents, web-research | 20 |
pdf_operator | PDF Operator | shell.full | pdf-manipulate, pdf-forms | 20 |
courier | Courier | mail.send, message.send | mail, notify | 20 |
secretary | Secretary | google.read, google.write | google | 20 |
github | GitHub Clerk | github.read, github.write, shell.full | github | 20 |
coder | Code Engineer | code.read, code.edit, shell.full, git.commit, git.push | coding | 200 |
investigator | Incident Investigator | code.read, incident.read, incident.report; gives up python.run, filesystem.write, team.ask, database.read, photos.fetch | incident | 40 |
A tool-call limit of 20 is IVRALO_TOOL_CALL_LIMIT's default; IVRALO_TOOL_CALL_LIMIT_<KEY> sets one specialist's, and IVRALO_MODEL_<KEY> its model. The Code Engineer's Python cannot write files: its changes go through the edit tools, which show each change and ask.
A specialist that declares gated capabilities is on the team only while at least one of them is effective; an ungated one such as shell.full does not keep it there. So the Librarian leaves when the index and the web are both off, the Courier without a mail backend or a chat, the Secretary without a Google service, the GitHub Clerk without a token, and the Code Engineer outside a git repository.
The main agent
You talk to the main agent. It is built like a specialist, from the main preset, with the same toolkits, approvals and limits. It does most of the work itself: it reads files and code, runs Python that only reads, changes code through the edit tools that ask, and runs the project's checks. It hands work to a specialist when a fresh context or a narrower grant is worth it.
Its grants are declared, not inherited. It may hold the union of everything the presets declare, plus the baseline, except:
- every grant that reads one of your accounts:
google.read,google.write,github.read,github.writeanddatabase.read. Those stay with the specialist you approved; team.ask, because it hands work off instead of asking;incident.readandincident.report, because only the Investigator files an incident report.
That leaves: python.run, filesystem.read, filesystem.write, user.ask, team.run, photos.fetch, shell.full, index.search, network.web, mail.send, message.send, code.read, code.edit, git.commit and git.push, each still under its gate, the profile and its approval.
| Setting | Main agent's value |
|---|---|
| Model | IVRALO_COORDINATOR_MODEL, else the main model |
| Tool calls per run | 200, or IVRALO_TOOL_CALL_LIMIT_COORDINATOR |
| Python | Read-only, like the Code Engineer's |
| Skills | The whole shelf, none owned |
IVRALO_MAIN_GRANTS narrows that set: a list of capability names separated by commas or spaces, or none. A name outside the declared set, or one that does not exist, never widens it; ivralo doctor says which names were ignored. However far it is narrowed, the main agent keeps team.run, so it can always hand work to a specialist.
# The main agent only reads; specialists do the writing.
IVRALO_MAIN_GRANTS="filesystem.read code.read python.run"
ivralo incident and POST /incident build a main agent that holds nothing but its hand-offs, so the Investigator does the investigation.