Skip to content

Commit cb19a7d

Browse files
committed
docs(rfc): define portable Claw agent settings
1 parent 13819ef commit cb19a7d

3 files changed

Lines changed: 125 additions & 18 deletions

File tree

rfcs/0016-claws.md

Lines changed: 67 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ title: Claws
33
authors:
44
- Gio
55
created: 2026-07-03
6-
last_updated: 2026-07-19
6+
last_updated: 2026-07-22
77
status: draft
88
issue:
99
rfc_pr: https://github.com/openclaw/rfcs/pull/27
@@ -94,8 +94,10 @@ adopting or merging into an existing agent or managed workspace.
9494
- Embedding model, provider, thinking-level, authentication, or other
9595
operator-controlled runtime defaults.
9696
- Embedding channel account ids, group ids, credentials, or bindings.
97-
- Setting `agents.list[].skills`; workspace-installed skills remain naturally
98-
discoverable and must not replace inherited allowlists.
97+
- Setting `agents.list[].skills`; package coordinates do not yet provide the
98+
canonical skill identities needed to validate an agent allowlist safely.
99+
Workspace-installed skills remain naturally discoverable and do not replace
100+
inherited allowlists.
99101
- Defining a generic `connector` installation concept. Channel capabilities are
100102
supplied by normal channel plugins and configured or bound locally.
101103
- Defining a feed-backed MCP connector catalog or replacing the Control UI's
@@ -121,6 +123,7 @@ principles.
121123
| Package identity | Package name and version come from the enclosing package metadata and authenticated publish operation, following the ClawHub plugin precedent. |
122124
| Operator control | Models, providers, credentials, channel bindings, and local runtime defaults are not portable Claw settings. |
123125
| Agent configuration | Only explicitly supported portable job settings can be copied into the new `agents.list[]` entry. |
126+
| Tool policy | A Claw may select a built-in profile registered by the applying OpenClaw version and refine it with portable allow, deny, and workspace-only filesystem policy. Host policy remains authoritative. |
124127
| Skills | Skill packages install into the new agent's workspace and are discovered normally; the Claw does not set `agent.skills`. |
125128
| Plugins | Plugin packages use existing plugin installers, safety checks, enablement rules, and install records. |
126129
| Discovery and composition | Hosted feeds discover and govern plugin and skill packages; a Claw composes exact resolved package versions and direct MCP declarations rather than defining another catalog. |
@@ -231,8 +234,15 @@ The initial public shape is grouped by OpenClaw ownership boundary:
231234
"workspaceAccess": "rw"
232235
},
233236
"tools": {
234-
"allow": ["read", "write", "edit", "web_fetch", "memory_search", "memory_get"],
235-
"deny": ["exec", "browser", "nodes"]
237+
"profile": "coding",
238+
"alsoAllow": ["cron"],
239+
"deny": ["exec", "browser", "nodes"],
240+
"fs": { "workspaceOnly": true }
241+
},
242+
"memorySearch": {
243+
"enabled": true,
244+
"rememberAcrossConversations": true,
245+
"sources": ["memory", "sessions"]
236246
},
237247
"heartbeat": {
238248
"every": "30m",
@@ -316,9 +326,11 @@ The schema version 1 field set, validation rules, JSON representation, and
316326
`CLAW.md` envelope are normative for the experimental implementation.
317327
Implementation slices may land separately behind the experimental gate, but a
318328
producer or consumer must not claim schema v1 conformance until it implements
319-
the complete grouped data model. Version 1 is strict: new portable fields,
320-
semantic changes, and ownership changes require a new schema version so
321-
existing consumers never interpret or silently discard an unknown declaration.
329+
the complete grouped data model. This addendum finalizes the experimental v1
330+
field set before graduation; omitted optional fields retain the prior behavior.
331+
After v1 graduates, new portable fields, semantic changes, and ownership changes
332+
require a new schema version so existing consumers never interpret or silently
333+
discard an unknown declaration.
322334

323335
Unknown fields fail closed. Implementations must not silently drop a declared
324336
component and still call the agent complete.
@@ -333,7 +345,10 @@ can include:
333345
- agent identity presentation;
334346
- group-chat mention patterns;
335347
- sandbox boundaries;
336-
- tool allow and deny policy;
348+
- a built-in tool profile registered by the applying OpenClaw version;
349+
- tool `allow` or `alsoAllow`, `deny`, and `fs.workspaceOnly` policy;
350+
- memory-search enablement, explicit cross-conversation memory opt-in, and the
351+
portable `memory` and `sessions` sources;
337352
- heartbeat behavior;
338353
- human-delay behavior.
339354

@@ -344,11 +359,31 @@ The following remain operator controlled and are rejected in a Claw manifest:
344359
- channel account ids, group ids, and bindings;
345360
- default-agent selection and global `agents.defaults`;
346361
- `agent.skills` allowlists;
362+
- custom tool-profile definitions, provider-specific tool policy, elevated
363+
access, executable defaults, and sender-specific policy;
364+
- memory providers, models, credentials, remote endpoints, local paths, and
365+
storage or indexing tuning;
347366
- arbitrary config fragments or unknown future agent fields.
348367

349368
The generated `agents.list[]` entry inherits operator defaults. Add appends one
350369
entry and does not rewrite existing list members or defaults.
351370

371+
A profile name is valid only when the applying OpenClaw version resolves it
372+
through the canonical built-in profile registry. The Claw schema must not copy a
373+
fixed list of profile names. A Claw carries a profile selection, not a custom
374+
profile definition. Global and operator policy continue to constrain the
375+
resulting tool surface and cannot be widened by a Claw.
376+
377+
`tools.allow` is an explicit allowlist. `tools.alsoAllow` extends a selected
378+
profile, so a single tools object must not contain both. Update preview resolves
379+
built-in profiles to their effective tool sets before classifying a profile
380+
change as an escalation or reduction. Enabling memory search, enabling
381+
`rememberAcrossConversations`, or adding a source is a capability escalation;
382+
disabling either behavior or removing a source is a reduction. A portable
383+
declaration of the `sessions` source requires
384+
`rememberAcrossConversations: true` so it cannot silently normalize to ordinary
385+
workspace memory.
386+
352387
For example, adding the illustrative manifest above with local agent id
353388
`github-triage` appends an agent entry while preserving the operator's current
354389
defaults and agents:
@@ -382,8 +417,15 @@ defaults and agents:
382417
"workspaceAccess": "rw"
383418
},
384419
"tools": {
385-
"allow": ["read", "write", "edit", "web_fetch", "memory_search", "memory_get"],
386-
"deny": ["exec", "browser", "nodes"]
420+
"profile": "coding",
421+
"alsoAllow": ["cron"],
422+
"deny": ["exec", "browser", "nodes"],
423+
"fs": { "workspaceOnly": true }
424+
},
425+
"memorySearch": {
426+
"enabled": true,
427+
"rememberAcrossConversations": true,
428+
"sources": ["memory", "sessions"]
387429
},
388430
"heartbeat": {
389431
"every": "30m",
@@ -658,6 +700,13 @@ servers, and cron jobs owned by the installed Claw. Local modifications become
658700
manual conflicts. Operator defaults, models, providers, credentials, bindings,
659701
and unrelated config remain untouched.
660702

703+
Portable tool-profile changes are compared using the built-in profile registry's
704+
resolved capabilities rather than opaque profile labels. Tool additions,
705+
memory-search enablement, cross-conversation memory, and added memory sources
706+
require distinct capability consent. Restricting filesystem access, disabling
707+
memory search or cross-conversation memory, or removing sources is reported as a
708+
reduction. Update compares inherited memory defaults before classification.
709+
661710
Consented update rebuilds the read-only plan immediately before mutation. Each
662711
owner uses its strongest available concurrency boundary: workspace content
663712
digests, expected MCP config values, stable cron declaration keys and scheduler
@@ -809,7 +858,7 @@ Implementation should widen the trust boundary in reviewable slices:
809858

810859
### Current OpenClaw implementation stack
811860

812-
The experimental implementation is one RFC plus twelve ordered OpenClaw PRs. Each
861+
The experimental implementation is one RFC plus thirteen ordered OpenClaw PRs. Each
813862
implementation PR is based on the preceding head so reviewers can evaluate one
814863
ownership boundary at a time:
815864

@@ -839,12 +888,17 @@ ownership boundary at a time:
839888
`CLAW.md` YAML-frontmatter input/export adaptation with grouped JSON read
840889
compatibility and no separate lifecycle behavior. It supersedes #106888,
841890
which was merged only into an obsolete stack head.
891+
13. [#112773](https://github.com/openclaw/openclaw/pull/112773) - registered
892+
built-in tool profile selection, portable tool modifiers and filesystem
893+
restriction, narrow memory-search behavior, export round trip, and
894+
capability-aware updates.
842895

843896
Public documentation follows the same staged boundary as the implementation.
844897
#101328 introduces the experimental guide, navigation, opt-in, schema, inspect,
845898
and add preview. Each later PR extends that guide only with the command or
846899
resource behavior implemented at that stage. #111391 adds only `CLAW.md`
847-
authoring and canonical export documentation. At every intermediate stack head,
900+
authoring and canonical export documentation. The final settings slice documents
901+
only the portable policy fields it implements. At every intermediate stack head,
848902
the guide must describe no later command or ownership behavior.
849903

850904
These PRs replace the old workspace-apply prototype rather than

rfcs/0016/claw-md-v1-spec.md

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,31 @@ The portable agent object is:
160160
| `sandbox.mode` | enum | No | `off`, `non-main`, or `all`. |
161161
| `sandbox.scope` | enum | No | `session`, `agent`, or `shared`. |
162162
| `sandbox.workspaceAccess` | enum | No | `none`, `ro`, or `rw`. |
163-
| `tools.allow` | string array | No | At least one non-empty string when present. |
163+
| `tools.profile` | string | No | Must resolve through the applying OpenClaw version's canonical built-in profile registry. Custom profile definitions are not portable. |
164+
| `tools.allow` | string array | No | At least one non-empty string when present; mutually exclusive with `tools.alsoAllow`. |
165+
| `tools.alsoAllow` | string array | No | At least one non-empty string when present; extends a selected profile and is mutually exclusive with `tools.allow`. |
164166
| `tools.deny` | string array | No | At least one non-empty string when present. |
167+
| `tools.fs.workspaceOnly` | boolean | No | Restricts filesystem tools to the new agent's workspace. |
168+
| `memorySearch.enabled` | boolean | No | Enables or disables memory search for the new agent. |
169+
| `memorySearch.rememberAcrossConversations` | boolean | No | Explicitly permits relevant context from the agent's other private conversations. |
170+
| `memorySearch.sources` | enum array | No | Non-empty array containing only `memory` and `sessions`; `sessions` requires `rememberAcrossConversations: true`. |
165171
| `heartbeat` | object | No | Exact portable heartbeat object below. |
166172
| `humanDelay` | object | No | Exact portable human-delay object below. |
167173

168174
All objects are strict. Consumers may accept empty optional objects, but
169175
canonical producers must omit an optional object when none of its members are
170176
present.
171177

178+
These fields map directly to existing per-agent OpenClaw configuration. The
179+
host's global tool and runtime policy remains authoritative. A Claw cannot carry
180+
custom profile definitions, provider-specific or sender-specific tool policy,
181+
elevated access, executable settings, memory providers or credentials, remote
182+
endpoints, local memory paths, or indexing/storage tuning.
183+
184+
The package `ref` for a skill is not necessarily its canonical runtime skill
185+
identity. Version 1 therefore does not set `agent.skills`; declared workspace
186+
skills are discovered normally and inherited operator allowlists remain intact.
187+
172188
`heartbeat` may contain only:
173189

174190
| Field | Type | Constraints |
@@ -341,8 +357,15 @@ agent:
341357
name: GitHub Triage
342358
description: Reviews incoming issues and prepares a daily summary.
343359
tools:
344-
allow: [read, write, web_fetch]
360+
profile: coding
361+
alsoAllow: [cron]
345362
deny: [exec]
363+
fs:
364+
workspaceOnly: true
365+
memorySearch:
366+
enabled: true
367+
rememberAcrossConversations: true
368+
sources: [memory, sessions]
346369
heartbeat:
347370
every: 30m
348371
workspace:
@@ -395,9 +418,12 @@ of the same schema version, not different capability levels.
395418

396419
## Compatibility and Evolution
397420

398-
Schema evolution requires a new integer `schemaVersion`. Consumers must reject
399-
unsupported versions rather than partially apply them. New optional fields must
400-
not be added to version 1 because strict v1 consumers reject unknown fields.
421+
This addendum finalizes the experimental schema version 1 field set before
422+
graduation. Consumers must reject unsupported versions rather than partially
423+
apply them. After graduation, new optional fields require a new integer
424+
`schemaVersion` because strict v1 consumers reject unknown fields. Omission of
425+
the portable tool and memory-search fields preserves existing inherited
426+
behavior.
401427

402428
There is no canonical byte serialization. Producers should emit stable field
403429
ordering and formatting for reviewable diffs, but semantic equality is based on
@@ -425,6 +451,9 @@ A conforming consumer must:
425451
- reject duplicate YAML keys and unknown schema fields;
426452
- validate all identifiers, exact versions, paths, environment references,
427453
cron expressions, timezones, and uniqueness constraints;
454+
- resolve profile names through the canonical built-in profile registry and
455+
reject unknown or custom profile names;
456+
- reject `tools.allow` combined with `tools.alsoAllow`;
428457
- ignore the Markdown body for runtime behavior;
429458
- preserve original bytes for integrity calculations;
430459
- reject a `CLAW.md` file larger than 1 MiB before parsing, including when it
@@ -445,4 +474,5 @@ A conforming producer must:
445474
timezones;
446475
- place human explanation, not executable declarations, in the Markdown body;
447476
- exclude credentials and operator-owned runtime choices;
477+
- emit only portable per-agent tool and memory-search settings;
448478
- validate the result against this specification before publication or export.

rfcs/0016/claw-package-v1-spec.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,22 @@ human-readable disclosure rather than being hidden in ordinary content
286286
reconciliation. The same classification applies during add and update; an
287287
owner must not invent a weaker capability-specific approval.
288288

289+
Portable agent tool profiles are selections from the applying harness's
290+
canonical built-in registry, not package-defined policy objects. Planning must
291+
show the selected profile and modifiers. Update planning must resolve built-in
292+
profiles to tool capabilities before classifying a profile change; it must not
293+
treat profile labels as opaque. Enabling memory search, enabling
294+
cross-conversation memory, or adding the `memory` or `sessions` source is an
295+
escalation. Restricting filesystem tools to the agent workspace, disabling
296+
memory search or cross-conversation memory, or removing a source is a reduction.
297+
The `sessions` source requires an explicit cross-conversation memory opt-in.
298+
Update classification resolves inherited memory defaults before comparison.
299+
300+
The applying host's global policy remains an upper bound. A package must not
301+
carry custom tool-profile definitions, local credentials or bindings, provider
302+
configuration, or local memory paths. Unsupported portable settings block the
303+
complete plan rather than being dropped.
304+
289305
An application profile may satisfy capability and content consent with one
290306
confirmation only when the plan represents the capability set separately and
291307
the supplied integrity token binds both sets exactly. A profile may instead
@@ -500,6 +516,12 @@ workspace sources. Export includes only portable supported state and excludes
500516
secrets, resolved environment values, models, providers, bindings, sessions,
501517
logs, caches, and unrelated global configuration.
502518

519+
For agent policy, export may preserve a registered built-in tool-profile
520+
selection, `allow` or `alsoAllow`, `deny`, `fs.workspaceOnly`, and memory-search
521+
`enabled`, `rememberAcrossConversations`, and `sources`. It must exclude custom
522+
profile definitions and all other tool or memory-search configuration. The
523+
exported manifest must pass the same strict validator before being returned.
524+
503525
Export may preserve an original package name and version only by returning the
504526
byte-for-byte original artifact with the same digest. Any regenerated package,
505527
including one exported from an unchanged installation, must use a new
@@ -548,6 +570,7 @@ A conforming applying client must:
548570
- delegate resources to canonical owners and record provenance;
549571
- fail closed on collisions, unsupported components, and unsafe paths;
550572
- distinguish applied state from local operational readiness;
573+
- preserve host policy as the upper bound for portable agent settings;
551574
- preserve drifted or independently owned state during update and remove;
552575
- derive managed and referenced relationships from canonical owner state;
553576
- retain referenced resources by default and bind any operator-selected

0 commit comments

Comments
 (0)