Skip to content
ivralo
Sections

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 strict profile removes it.

The registry

CapabilityWhat it allowsGateApprovalStrict
python.runRun Python in the workspace, in a worker process of its own.-nonekeeps
filesystem.readRead files: the workspace, and anywhere the user can read. Only a .env file is refused.-nonekeeps
filesystem.writeWrite files inside the workspace, through the write guard that keeps history.-nonekeeps
user.askPut a question to the person and wait for the answer.-nonekeeps
team.askPut one question to a colleague and get its answer back. The colleague only reads.IVRALO_ASK_MEMBERnonekeeps
team.runHand 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 0nonekeeps
database.readQuery your own databases, each by name, read-only.IVRALO_SQL_URL or databases.jsonnonecannot drop
photos.fetchFetch a stock photo from Unsplash into the workspace.IVRALO_UNSPLASH_ACCESS_KEYnonecannot drop
shell.fullRun a shell command in the workspace, judged by the shell policy.-verdictdrops
index.searchSearch the workspace's knowledge index and cite the place.IVRALO_KNOWLEDGEnonekeeps
network.webSearch the web, read a page and save one, with no API key.IVRALO_WEBnonedrops
mail.sendSend e-mail to the addresses you named.IVRALO_MAILalwaysdrops
message.sendPost a short message to the configured Telegram or Slack chat.IVRALO_TELEGRAM_BOT_TOKEN or IVRALO_SLACK_WEBHOOK_URLalwaysdrops
google.readRead your Google calendar, mail, Drive and Sheets.IVRALO_GOOGLE_SERVICESnonekeeps
google.writeDraft, create and update in Google Workspace; never send. Implies google.read.IVRALO_GOOGLE_WRITE, and a person therecalldrops
github.readRead repositories, issues, pull requests and code on GitHub.GITHUB_ACCESS_TOKENnonekeeps
github.writeCreate and edit on GitHub; never delete a repository. Implies github.read.IVRALO_GITHUB_WRITE, and a person therecalldrops
code.readRead the code of the repository the workspace is: files, an outline, a search.a .git at the workspace rootnonekeeps
code.editChange a file by an exact replacement, inside the workspace, read first, each edit shown and approved. Implies code.read.a .git at the workspace rootcalldrops
git.commitMake 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 rootcalldrops
git.pushPush 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 gitconfigalwaysdrops
incident.readRead an evidence bundle and the repository's history into ivralo's own digest. Refused on a hosted model unless allowed.-nonekeeps
incident.reportFile the incident report under .ivralo/incidents/, checked against the evidence.-nonekeeps

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:

CapabilityWhy it is in the baseline
python.runEvery specialist works by running Python.
filesystem.read, filesystem.writeThe workspace is where the work is.
user.askAny specialist may need to ask you something.
team.askAny specialist may ask a colleague a question.
team.runAny 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.fetchThe 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_MODEGranted unattended
developer (default)Nothing that asks.
servergit.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.

KeyNameBeyond the baselineOwns these skillsTool calls
analystData Analyst-analysis, xlsx20
spreadsheetSpreadsheet Builder-xlsx, analysis20
visualizerChart Designer-charts, analysis20
reporterReport Writershell.fullpdf-generate, charts, unicode, photos20
scribeDocument and Deck Writershell.fulldocx, pptx, unicode, photos20
librarianLibrarianindex.search, network.webdocuments, web-research20
pdf_operatorPDF Operatorshell.fullpdf-manipulate, pdf-forms20
courierCouriermail.send, message.sendmail, notify20
secretarySecretarygoogle.read, google.writegoogle20
githubGitHub Clerkgithub.read, github.write, shell.fullgithub20
coderCode Engineercode.read, code.edit, shell.full, git.commit, git.pushcoding200
investigatorIncident Investigatorcode.read, incident.read, incident.report; gives up python.run, filesystem.write, team.ask, database.read, photos.fetchincident40

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.write and database.read. Those stay with the specialist you approved;
  • team.ask, because it hands work off instead of asking;
  • incident.read and incident.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.

SettingMain agent's value
ModelIVRALO_COORDINATOR_MODEL, else the main model
Tool calls per run200, or IVRALO_TOOL_CALL_LIMIT_COORDINATOR
PythonRead-only, like the Code Engineer's
SkillsThe 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.