Settings
The sandbox's own configuration, plus what it has saved you and which rules fired
On this page(11 sections)
- How this sandbox is configured
- Change the sandbox settings
- What the token-saving measures were worth
- Read a built-in system prompt
- When each rule last did something
- What each repository asks to run on its own code
- The state of this sandbox's field notes
- Offer this sandbox a clock, if it has none
- Which words the editor uses for you here
- Choose which words the editor uses for you here
- Switch a repository's own checks on or off
Read and write the settings that govern how agents behave here. The other three routes are read-only reports on their effects: what the token-saving measures were actually worth, the text behind a built-in prompt, and when each rule last did something.
11 calls. Pick one to open it, or use the list on the right.
GET/settingsHow this sandbox is configured
Every setting that governs how agents behave here, with the defaults filled in for anything nobody has chosen.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
timezoneWhich clock this sandbox's schedules are… | "" | string |
stableSystemPromptKeep the instructions identical between turns… | boolean |
skillsWhich built-in tools are switched on | string[] |
personaRoutingWhether a new chat is matched… | boolean |
hashlineEditsHave the agent edit files by… | boolean |
systemPromptModeWhich instructions the agent starts from:… | "intentic" | "claude" | "custom" |
systemPromptYour own instructions, used only when… | string |
leanGuidanceSend this product's own guidance in… | boolean |
leanGuidanceHoldoutWhat share of conversations to keep… | number |
toolResultClearingReplace old tool results from a… | boolean |
toolResultClearingHoldoutWhat share of conversations keep every… | number |
iqSearchTeach the agent how to use… | boolean |
iqSearchHoldoutWhat share of conversations to run… | number |
workspaceMapOpen every conversation with a map… | boolean |
workspaceMapHoldoutWhat share of conversations to open… | number |
fieldNotesOpen every turn with a brief… | boolean |
fieldNotesBudgetHow much of that brief to… | integer |
fieldNotesHoldoutWhat share of conversations to run… | number |
outputCleanersWhich command outputs to trim before… | string |
outputHoldoutWhat share of commands to leave… | number |
modelRolesWhich models do which job, one… | object |
autoModelGuidanceWhat you would tell somebody choosing… | string |
changelogReposWhich repositories keep a changelog, and… | string[] |
agentRetentionDaysHow many days a finished conversation… | number |
limitPolicyWhat happens to a turn a… | "wait" | "resend" | "move" |
outagePolicyWhat happens to a turn the… | "wait" | "retry" |
stopPolicyWhat happens to a turn that… | "wait" | "retry" |
limitMoveCarryUnderWhen a spent usage limit moves… | integer |
keepWarmKeeping an idle conversation's prompt cache… | object |
autoKeep a Claude conversation's prompt cache… | boolean |
hoursHow long an idle conversation is… | number |
minTokensOnly conversations at least this large,… | integer |
reserveHow much of an account's usage… | integer |
autoRepairWhether main's CI failing is repaired… | boolean |
followOriginWhether each workspace repo keeps up… | boolean |
offloadWhich heavy work runs on a… | object |
commands | object |
continueWhenNeedMetWhether a conversation carries on by… | boolean |
autoResumeOnRestartWhether a turn killed by the… | boolean |
adoptedChecksWhich repositories may run the checks… | object |
rulesStanding decisions about the sandbox's own… | object[] |
id | string |
label | string |
moment | "file.edited" | "turn.ending" | "agent.finished" | "agent.landed" |
when | object |
repo | string |
paths | string[] |
outcome | "clean" | "error" | "conflict" | "checks-failed"[] |
sample | number |
action | object |
when kind is "command" | shape |
command | string |
timeoutMs | number |
when kind is "verdict" | shape |
verdict | "allow" | "hold" |
when kind is "builtin" | shape |
name | "verify-ui-edits" | "version-landed" |
enabled | boolean |
automationFailureLimitHow many failures in a row… | number |
admissionWhether work started from outside may… | object |
schedule | "allow" | "hold" | "deny" |
event | "allow" | "hold" | "deny" |
listener | "allow" | "hold" | "deny" |
webchat | "allow" | "hold" | "deny" |
issues | "allow" | "hold" | "deny" |
workspace | "allow" | "hold" | "deny" |
workflow | "allow" | "deny" |
actionRulesWhat an agent may do out… | object |
commandJudgeWhether a model reads your safety… | "off" | "watch" | "on" |
projectInstallsWhat happens when an agent installs… | "automatic" | "ask" | "never" |
subagentsAtOnceHow many subagents may work at… | number |
subagentsPerTurnHow many a single turn may… | number |
subagentDepthHow many levels deep the delegation… | number |
curl "$SANDBOX/settings" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.get();POST/settingsChange the sandbox settings
Writes the settings whole, so send the complete object rather than the fields you changed.
What you send
| Field | Type | Where |
|---|---|---|
timezoneWhich clock this sandbox's schedules are… | "" | string | body |
stableSystemPromptKeep the instructions identical between turns… | boolean | body |
skillsWhich built-in tools are switched on | string[] | body |
personaRoutingWhether a new chat is matched… | boolean | body |
hashlineEditsHave the agent edit files by… | boolean | body |
systemPromptModeWhich instructions the agent starts from:… | "intentic" | "claude" | "custom" | body |
systemPromptYour own instructions, used only when… | string | body |
leanGuidanceSend this product's own guidance in… | boolean | body |
leanGuidanceHoldoutWhat share of conversations to keep… | number | body |
toolResultClearingReplace old tool results from a… | boolean | body |
toolResultClearingHoldoutWhat share of conversations keep every… | number | body |
iqSearchTeach the agent how to use… | boolean | body |
iqSearchHoldoutWhat share of conversations to run… | number | body |
workspaceMapOpen every conversation with a map… | boolean | body |
workspaceMapHoldoutWhat share of conversations to open… | number | body |
fieldNotesOpen every turn with a brief… | boolean | body |
fieldNotesBudgetHow much of that brief to… | integer | body |
fieldNotesHoldoutWhat share of conversations to run… | number | body |
outputCleanersWhich command outputs to trim before… | string | body |
outputHoldoutWhat share of commands to leave… | number | body |
modelRolesWhich models do which job, one… | object | body |
autoModelGuidanceWhat you would tell somebody choosing… | string | body |
changelogReposWhich repositories keep a changelog, and… | string[] | body |
agentRetentionDaysHow many days a finished conversation… | number | body |
limitPolicyWhat happens to a turn a… | "wait" | "resend" | "move" | body |
outagePolicyWhat happens to a turn the… | "wait" | "retry" | body |
stopPolicyWhat happens to a turn that… | "wait" | "retry" | body |
limitMoveCarryUnderWhen a spent usage limit moves… | integer | body |
keepWarmKeeping an idle conversation's prompt cache… | object | body |
autoKeep a Claude conversation's prompt cache… | boolean | body |
hoursHow long an idle conversation is… | number | body |
minTokensOnly conversations at least this large,… | integer | body |
reserveHow much of an account's usage… | integer | body |
autoRepairWhether main's CI failing is repaired… | boolean | body |
followOriginWhether each workspace repo keeps up… | boolean | body |
offloadWhich heavy work runs on a… | object | body |
commands | object | body |
continueWhenNeedMetWhether a conversation carries on by… | boolean | body |
autoResumeOnRestartWhether a turn killed by the… | boolean | body |
adoptedChecksWhich repositories may run the checks… | object | body |
rulesStanding decisions about the sandbox's own… | object[] | body |
idrequired | string | body |
labelrequired | string | body |
momentrequired | "file.edited" | "turn.ending" | "agent.finished" | "agent.landed" | body |
when | object | body |
repo | string | body |
paths | string[] | body |
outcome | "clean" | "error" | "conflict" | "checks-failed"[] | body |
sample | number | body |
actionrequired | object | body |
when kind is "command" | shape | body |
commandrequired | string | body |
timeoutMs | number | body |
when kind is "verdict" | shape | body |
verdictrequired | "allow" | "hold" | body |
when kind is "builtin" | shape | body |
namerequired | "verify-ui-edits" | "version-landed" | body |
enabled | boolean | body |
automationFailureLimitHow many failures in a row… | number | body |
admissionWhether work started from outside may… | object | body |
schedule | "allow" | "hold" | "deny" | body |
event | "allow" | "hold" | "deny" | body |
listener | "allow" | "hold" | "deny" | body |
webchat | "allow" | "hold" | "deny" | body |
issues | "allow" | "hold" | "deny" | body |
workspace | "allow" | "hold" | "deny" | body |
workflow | "allow" | "deny" | body |
actionRulesWhat an agent may do out… | object | body |
commandJudgeWhether a model reads your safety… | "off" | "watch" | "on" | body |
projectInstallsWhat happens when an agent installs… | "automatic" | "ask" | "never" | body |
subagentsAtOnceHow many subagents may work at… | number | body |
subagentsPerTurnHow many a single turn may… | number | body |
subagentDepthHow many levels deep the delegation… | number | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/settings" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"timezone":"","stableSystemPrompt":false,"skills":["…","…"],"personaRouting":true,"hashlineEdits":false,"systemPromptMode":"intentic","systemPrompt":"","leanGuidance":false,"leanGuidanceHoldout":0,"toolResultClearing":false,"toolResultClearingHoldout":0.5,"iqSearch":false,"iqSearchHoldout":0,"workspaceMap":false,"workspaceMapHoldout":0,"fieldNotes":false,"fieldNotesBudget":4000,"fieldNotesHoldout":0,"outputCleaners":"","outputHoldout":0,"modelRoles":{"src/app.ts":[{"provider":"claude","model":"claude-sonnet-4-6","effort":"…","thinking":true,"fast":true,"harness":"native"},{"provider":"claude","model":"claude-haiku-4-6","effort":"…","thinking":true,"fast":true,"harness":"claude-code"}],"README.md":[{"provider":"claude","model":"claude-sonnet-4-6","effort":"…","thinking":true,"fast":true,"harness":"native"},{"provider":"claude","model":"claude-haiku-4-6","effort":"…","thinking":true,"fast":true,"harness":"claude-code"}]},"autoModelGuidance":"","changelogRepos":["…","…"],"agentRetentionDays":3,"limitPolicy":"wait","outagePolicy":"wait","stopPolicy":"wait","limitMoveCarryUnder":100000,"keepWarm":{"auto":false,"hours":4,"minTokens":100000,"reserve":15},"autoRepair":true,"followOrigin":true,"offload":{"commands":{"src/app.ts":"…","README.md":"…"}},"continueWhenNeedMet":true,"autoResumeOnRestart":false,"adoptedChecks":{"src/app.ts":"…","README.md":"…"},"rules":[{"id":"a1b2c3d4","label":"Nightly changelog","moment":"file.edited","when":{"repo":"root","paths":["src/app.ts","README.md"],"outcome":["clean","error"],"sample":1},"action":{"kind":"command","command":"pnpm dev","timeoutMs":900000},"enabled":true},{"id":"e5f6a7b8","label":"Release notes","moment":"turn.ending","when":{"repo":"site","paths":["src/app.ts","README.md"],"outcome":["clean","error"],"sample":1},"action":{"kind":"command","command":"pnpm build","timeoutMs":900000},"enabled":true}],"automationFailureLimit":0,"admission":{"schedule":"allow","event":"allow","listener":"allow","webchat":"allow","issues":"allow","workspace":"allow","workflow":"allow"},"actionRules":{"src/app.ts":"allow","README.md":"hold"},"commandJudge":"off","projectInstalls":"automatic","subagentsAtOnce":20,"subagentsPerTurn":200,"subagentDepth":3}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.set({
"timezone": "",
"stableSystemPrompt": false,
"skills": [
"…",
"…"
],
"personaRouting": true,
"hashlineEdits": false,
"systemPromptMode": "intentic",
"systemPrompt": "",
"leanGuidance": false,
"leanGuidanceHoldout": 0,
"toolResultClearing": false,
"toolResultClearingHoldout": 0.5,
"iqSearch": false,
"iqSearchHoldout": 0,
"workspaceMap": false,
"workspaceMapHoldout": 0,
"fieldNotes": false,
"fieldNotesBudget": 4000,
"fieldNotesHoldout": 0,
"outputCleaners": "",
"outputHoldout": 0,
"modelRoles": {
"src/app.ts": [
{
"provider": "claude",
"model": "claude-sonnet-4-6",
"effort": "…",
"thinking": true,
"fast": true,
"harness": "native"
},
{
"provider": "claude",
"model": "claude-haiku-4-6",
"effort": "…",
"thinking": true,
"fast": true,
"harness": "claude-code"
}
],
"README.md": [
{
"provider": "claude",
"model": "claude-sonnet-4-6",
"effort": "…",
"thinking": true,
"fast": true,
"harness": "native"
},
{
"provider": "claude",
"model": "claude-haiku-4-6",
"effort": "…",
"thinking": true,
"fast": true,
"harness": "claude-code"
}
]
},
"autoModelGuidance": "",
"changelogRepos": [
"…",
"…"
],
"agentRetentionDays": 3,
"limitPolicy": "wait",
"outagePolicy": "wait",
"stopPolicy": "wait",
"limitMoveCarryUnder": 100000,
"keepWarm": {
"auto": false,
"hours": 4,
"minTokens": 100000,
"reserve": 15
},
"autoRepair": true,
"followOrigin": true,
"offload": {
"commands": {
"src/app.ts": "…",
"README.md": "…"
}
},
"continueWhenNeedMet": true,
"autoResumeOnRestart": false,
"adoptedChecks": {
"src/app.ts": "…",
"README.md": "…"
},
"rules": [
{
"id": "a1b2c3d4",
"label": "Nightly changelog",
"moment": "file.edited",
"when": {
"repo": "root",
"paths": [
"src/app.ts",
"README.md"
],
"outcome": [
"clean",
"error"
],
"sample": 1
},
"action": {
"kind": "command",
"command": "pnpm dev",
"timeoutMs": 900000
},
"enabled": true
},
{
"id": "e5f6a7b8",
"label": "Release notes",
"moment": "turn.ending",
"when": {
"repo": "site",
"paths": [
"src/app.ts",
"README.md"
],
"outcome": [
"clean",
"error"
],
"sample": 1
},
"action": {
"kind": "command",
"command": "pnpm build",
"timeoutMs": 900000
},
"enabled": true
}
],
"automationFailureLimit": 0,
"admission": {
"schedule": "allow",
"event": "allow",
"listener": "allow",
"webchat": "allow",
"issues": "allow",
"workspace": "allow",
"workflow": "allow"
},
"actionRules": {
"src/app.ts": "allow",
"README.md": "hold"
},
"commandJudge": "off",
"projectInstalls": "automatic",
"subagentsAtOnce": 20,
"subagentsPerTurn": 200,
"subagentDepth": 3
});GET/settings/savingsWhat the token-saving measures were worth
Measured rather than estimated: what each mechanism actually saved over a range of days. The same day range the spending ledger takes, so one calendar filters both.
What you send
| Field | Type | Where |
|---|---|---|
fromFirst day to include, as YYYY-MM-DD… | string | query |
toLast day to include, as YYYY-MM-DD… | string | query |
What comes back
| Field | Type |
|---|---|
input | object |
updatedAt | number |
commands | number |
rawTokens | number |
emittedTokens | number |
savedPct | number |
perCleaner | object[] |
id | string |
commands | number |
savedTokens | number |
holdout | object |
cleaned | number |
heldOut | number |
measuredSavedPct | number |
gaps | object[] |
command | string |
commands | number |
tokens | number |
search | object |
metrics | object[] |
metric | "searchCalls" | "openingSearches" | "openingListings" | "callsBeforeTarget" … (7) |
on | object |
turns | number |
mean | number |
off | object |
turns | number |
mean | number |
controlTurnsNeeded | number |
marginPct | number |
deltaPct | number |
saved | number |
minTurns | number |
sampleUnit | "turns" | "conversations" | "opening turns" |
cohort | string |
map | object |
metrics | object[] |
metric | "searchCalls" | "openingSearches" | "openingListings" | "callsBeforeTarget" … (7) |
on | object |
turns | number |
mean | number |
off | object |
turns | number |
mean | number |
controlTurnsNeeded | number |
marginPct | number |
deltaPct | number |
saved | number |
minTurns | number |
sampleUnit | "turns" | "conversations" | "opening turns" |
cohort | string |
notes | object |
metrics | object[] |
metric | "searchCalls" | "openingSearches" | "openingListings" | "callsBeforeTarget" … (7) |
on | object |
turns | number |
mean | number |
off | object |
turns | number |
mean | number |
controlTurnsNeeded | number |
marginPct | number |
deltaPct | number |
saved | number |
minTurns | number |
sampleUnit | "turns" | "conversations" | "opening turns" |
cohort | string |
guidance | object |
metrics | object[] |
metric | "searchCalls" | "openingSearches" | "openingListings" | "callsBeforeTarget" … (7) |
on | object |
turns | number |
mean | number |
off | object |
turns | number |
mean | number |
controlTurnsNeeded | number |
marginPct | number |
deltaPct | number |
saved | number |
minTurns | number |
sampleUnit | "turns" | "conversations" | "opening turns" |
cohort | string |
clearing | object |
metrics | object[] |
metric | "searchCalls" | "openingSearches" | "openingListings" | "callsBeforeTarget" … (7) |
on | object |
turns | number |
mean | number |
off | object |
turns | number |
mean | number |
controlTurnsNeeded | number |
marginPct | number |
deltaPct | number |
saved | number |
minTurns | number |
sampleUnit | "turns" | "conversations" | "opening turns" |
cohort | string |
curl "$SANDBOX/settings/savings" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.savings();GET/settings/system-prompt/{base}Read a built-in system prompt
The actual text behind one of the built-in modes, so a settings screen can show the prompt instead of asking anyone to trust a description of it, and so either can be forked into a custom one.
What you send
| Field | Type | Where |
|---|---|---|
baserequired | "intentic" | "claude" | address |
What comes back
| Field | Type |
|---|---|
text | string |
version | string |
curl "$SANDBOX/settings/system-prompt/intentic" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.builtinPrompt({
"base": "intentic"
});GET/settings/rule-firingsWhen each rule last did something
A separate read rather than a field on the settings, because a rule firing is not somebody editing anything: folding it in would turn every firing into a settings write and put a self-changing value inside the object a screen edits.
What you send
Nothing. Call it as it is.
What comes back
A plain value rather than an object. The example below is the whole of it.
curl "$SANDBOX/settings/rule-firings" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.firings();GET/settings/repo-checksWhat each repository asks to run on its own code
Every repository that declares its own checks at `.intentic/checks.json`, what it declares, and whether you have switched it on. A repository declares what to run because the command belongs beside the scripts it names; nothing it declares runs until you say so.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
reposEvery repository that declares checks, in… | object[] |
repoWhich repository, by its workspace id… | string |
pathWhere the declaration lives, relative to… | string |
checksWhat it declares, in the order… | object[] |
whenWhen to run it: `edit` on… | "edit" | "turn" | "land" |
runThe command, run in this repository's… | string |
labelWhat to call it on screen | string |
timeoutMsHow long it may take before… | number |
pathsOnly run it when the change… | string[] |
firedWhen each declared check last reported… | number[] |
adoptedWhether these are running | boolean |
changedWhether the declaration changed since it… | boolean |
errorWhy the file could not be… | string |
curl "$SANDBOX/settings/repo-checks" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.repoChecks();GET/settings/field-notesThe state of this sandbox's field notes
Whether `.intentic/config/field-notes.toon` exists, when it was last rewritten, how much of it the current budget reaches, and whether a monthly rewrite is scheduled.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
present | boolean |
writtenAt | number |
ranksSent | number |
ranksTotal | number |
chars | number |
automation | "missing" | "enabled" | "disabled" |
nextRunAt | number |
unreadable | string |
curl "$SANDBOX/settings/field-notes" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.fieldNotes();POST/settings/timezoneOffer this sandbox a clock, if it has none
Sets which timezone this sandbox's schedules are meant in, but only while it has none set. Already answered, the stored zone wins and comes back unchanged, so any number of browsers can offer theirs without fighting over it. To change a zone that is already set, write the settings.
What you send
| Field | Type | Where |
|---|---|---|
timezonerequiredThe zone the offering machine is… | string | body |
What comes back
| Field | Type |
|---|---|
timezoneThe zone this sandbox's schedules are… | string |
adoptedWhether this call is what set… | boolean |
curl -X POST "$SANDBOX/settings/timezone" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"timezone":"…"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.adoptTimezone({
"timezone": "…"
});GET/settings/audienceWhich words the editor uses for you here
Whether your editor speaks git's own words (developer) or plain ones (maker) on this sandbox, in every browser and on every device. Absent until you have chosen here.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
audiencedeveloper for git's own words, maker… | "developer" | "maker" |
curl "$SANDBOX/settings/audience" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.audience();POST/settings/audienceChoose which words the editor uses for you here
Sets whether your editor speaks git's own words (developer) or plain ones (maker) on this sandbox, for every browser and device you open it on. Other members keep their own. With `offer` it is taken only while you have none kept, and the kept answer comes back unchanged.
What you send
| Field | Type | Where |
|---|---|---|
audiencerequireddeveloper for git's own words, maker… | "developer" | "maker" | body |
offerTake it only while this person… | boolean | body |
What comes back
| Field | Type |
|---|---|
audienceThe words this sandbox's editor now… | "developer" | "maker" |
adoptedWhether this call set it | boolean |
curl -X POST "$SANDBOX/settings/audience" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"audience":"developer","offer":true}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.setAudience({
"audience": "developer",
"offer": true
});POST/settings/repo-checks/adoptSwitch a repository's own checks on or off
Adopts exactly what that repository declares as it stands now. If the declaration changes afterwards it stops running until you adopt it again, so a command nobody has read cannot inherit the answer given to a different one.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich repository's declaration to switch | string | body |
onrequiredOn adopts what it declares as… | boolean | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/settings/repo-checks/adopt" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","on":true}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.settings.adoptRepoChecks({
"repo": "root",
"on": true
});