Expand description
ORCH-21 — the profile noun at the CONTROLLED tier: create and delete a
routed config home through the HARNESS’S OWN verb, with supercode as the
uniform client.
Charter (docs/plans/orchestration-domain-11-2026-09-02.md §0.4):
supercode never owns a harness’s config plane. It makes no directory,
writes no config file, and removes nothing itself. Each verb below is a
subprocess of the harness’s own CLI, run in the harness’s own home:
- Hermes —
hermes profile create <name>/hermes profile delete --yes <name>withHERMES_HOMEpointing at the ROOT home the caller addressed (HERMES_HOME/profiles/<name>is what the verb makes; upstreamhermes_constants.get_default_hermes_rootderives the profiles root from that variable).--clone-fromcarries the uniformfrom. - OpenClaw —
openclaw agents add <id> --workspace <dir> --non-interactive --json/openclaw agents delete <id> --force --json, pointed at the caller’s state dir through openclaw’s own environment contract. At the pin these editopenclaw.jsondirectly (agents.list);agents deleteadditionally offers the change to a RUNNING gateway when one is reachable, resolving that endpoint itself — neither verb takes a--url/--tokenflag, so supercode passes no credential here. - The orchestrator — its own package (ORC-13). A profile IS a folder
whose files are the model’s serialization (
docs/ORCHESTRATOR-IR.md§6), socreateis a new folder record followed by the package’s ownsave(), anddeleteremoves the record and has the daemon RENAME the folder intoprofiles/.trash/<name>-<stamp>/— nothing is ever unlinked. Both go throughcrate::orchestrator_door: the daemon’s socket while it is up,node bin/orchestrator.mjs profiles.create|deletewhen it is down. supercode still writes no file of that folder itself. - Codex — refused. A Codex profile is a
[profiles.<name>]TABLE that a human (or a tool) authors in$CODEX_HOME/config.toml; Codex publishes nocodex profile create|deleteverb, so supercode names that door rather than editing another harness’s config file behind its back. - supercode presets — refused. A preset is compiled-in CODE
(
crate::presets::RESERVED_PRESET_NAMES), not a directory a verb can make.
The three tier rules inherited from ORCH-18 hold here unchanged:
- The harness’s answer is the answer. After the verb exits 0 the row
is re-read through the ORCH-10 loader (
crate::profiles) and returned. A non-zero exit surfaces the harness’s own stderr as the error — never a silent success, never a supercode-invented row. - The command is narrated. Every outcome carries
ran: the exact argv that was executed, credentials redacted. - A verb the harness does not publish is refused
(
ProfileControlError::Unsupported→UnsupportedAction), never faked.
One deliberate flag supercode does NOT let the harness default: nothing
here writes outside the home the caller addressed. hermes profile create
also drops a wrapper script into ~/.local/bin/<name> (upstream
profiles.py::_get_wrapper_dir, which ignores HERMES_HOME), so the
non-interactive client form passes --no-alias — a programmatic
profiles.create against an isolated home must not install an executable
on the caller’s PATH. The flag is in ran, so the choice is visible.
Structs§
- Profile
Mutation - One mutating request, in the uniform Domain 11 vocabulary.
- Profile
Mutation Outcome - What one mutation did, with the harness’s own row read back afterwards.
Enums§
- Profile
Control Error - Why a profile mutation could not be performed.
- Profile
Verb - One uniform mutating verb over the profile noun.
Constants§
- CODEX_
REFUSAL - Why Codex refuses
profiles.create/profiles.delete. - CONTROLLED_
PROFILE_ HARNESSES - Harnesses whose profiles supercode can MUTATE through their own CLI verb.
Strictly narrower than
crate::profiles::PROFILE_HARNESSES: Codex profiles and supercode presets are readable but not controllable. - PRESET_
REFUSAL - Why supercode’s own presets refuse the same two verbs.
Functions§
- mutate
- Perform one mutation: translate to the harness’s own verb, run it, then re-read the row through the ORCH-10 loader.
- supports_
profile_ control - Whether
harnesscan have its profiles mutated at all.