Workflow
When this skill is invoked, the user provides a plain-English description of the assistant they want to deploy. Your job is to parse that description and emit a complete, valid assistant configuration JSON that an OpenClaw-style runtime can consume directly.
This skill produces the configuration only. Deploying the assistant, provisioning channel credentials, and wiring tool integrations to live services are out of scope — that is the productionization gap the operator bridges after receiving this config.
Step 1 — Extract the assistant intent
Read the user's description carefully and extract every distinct component:
- Persona: What tone, name, and purpose should the assistant have? Extract a concise persona string — the assistant's "character" in one to two sentences.
- Channels: Which messaging surfaces should the assistant be active on? Identify each channel type (e.g., slack, email, sms, whatsapp, discord, web_chat, teams) and any scope constraints per channel (e.g., "read-only in #support", "only DMs from customers").
- Desired capabilities: What should the assistant be able to do? List every distinct action mentioned — read tickets, draft replies, look up orders, update CRM records, send messages, trigger webhooks, etc.
- Explicit restrictions: What should the assistant never do without confirmation, or never do at all? If the user says "must ask before sending", "never delete", "never make payments" — note these as explicit deny or ask constraints.
- Audience: Who interacts with this assistant? (Customers, internal team, developers.) This informs the persona tone and default safety posture.
If a constraint is not mentioned, default to the safe side: outbound messages and any write operations default to "ask", financial or destructive operations default to "deny".
Step 2 — Build the tool allowlist
Map each capability identified in Step 1 to a named tool. Assign a permission level to each tool:
"auto" — the assistant may invoke this tool without asking the user, for clearly safe read operations (e.g., read_tickets, search_knowledge_base, get_order_status).
"ask" — the assistant must present the proposed action to the user for confirmation before executing, for any outbound message, write to an external system, or moderately sensitive read (e.g., send_email, post_slack_message, update_crm_record, reply_to_ticket).
"deny" — the assistant may never invoke this tool, for financial, destructive, or privileged operations (e.g., make_payment, delete_record, admin_impersonate).
Include a reason string on every tool explaining the permission decision. Always include a make_payment tool set to "deny" and a delete_record tool set to "deny" as baseline safety anchors — even if the user did not mention them — to demonstrate the default-deny posture.
Step 3 — Define guardrails
Produce a guardrails block with these fields:
default_tool_permission — always "deny". Any tool not in the allowlist is denied by default.
max_actions_per_run — a reasonable ceiling on consecutive autonomous actions (suggest 25 unless the user implies a higher-volume use case).
require_confirmation_for — an array of operation categories that always require user confirmation regardless of individual tool permission. At minimum: ["outbound_message", "payment", "data_deletion"].
redact_pii_in_logs — always true unless the user explicitly says logs may contain PII.
Step 4 — Define the escalation policy
Produce an escalation block specifying what happens when the assistant is uncertain or blocked:
to — "human" by default.
when — an array of trigger conditions. At minimum: ["ambiguous_request", "tool_denied", "low_confidence"]. Add "sensitive_topic" if the audience is customers. Add "escalation_keyword" if the user mentions words like "urgent", "legal", "compliance".
Step 5 — Assemble and self-check the JSON config
Emit a single JSON object with this shape:
{
"assistant": {
"name": "<assistant name>",
"persona": "<one-to-two sentence persona description>",
"description": "<one-sentence functional summary>"
},
"channels": [
{ "type": "<channel_type>", "enabled": true, "scope": "<scope constraint or 'all'>" }
],
"tools": [
{
"name": "<tool_name_in_snake_case>",
"permission": "auto | ask | deny",
"reason": "<plain-English explanation of why this permission level>"
}
],
"guardrails": {
"default_tool_permission": "deny",
"max_actions_per_run": 25,
"require_confirmation_for": ["outbound_message", "payment", "data_deletion"],
"redact_pii_in_logs": true
},
"escalation": {
"to": "human",
"when": ["ambiguous_request", "tool_denied", "low_confidence"]
}
}
Before emitting, verify:
- Every tool in the
tools array has a non-empty name, a permission value from the allowed set (auto, ask, deny), and a non-empty reason.
make_payment and delete_record are present with permission: "deny".
- Every channel in
channels has a type and an enabled boolean.
guardrails.default_tool_permission is "deny".
require_confirmation_for includes at minimum "outbound_message", "payment", and "data_deletion".
- The document is syntactically valid JSON — no trailing commas, no comments, no single-quoted strings.
If any check fails, fix it before emitting.
Safety-first design principle
The configuration follows a default-deny posture: any tool not explicitly listed in tools[] is automatically denied. Outbound actions (messages, emails, posts) and any write to an external system require explicit user confirmation ("ask") unless the user explicitly grants auto-approval. Financial and destructive operations are always "deny". This mirrors the "safe" pillar in Klaus AI's hosted assistant design and the OpenClaw runtime's permission model.
Example
See examples/input.md for a plain-English assistant request (a customer support assistant on Slack and email that reads tickets and drafts replies but must ask before sending anything external).
See examples/output.md for the complete, valid JSON assistant configuration this skill produces from that input.
1---2name: klaus-assistant-config3description: Given a plain-English description of the assistant a user wants, produce a complete JSON assistant configuration — persona, enabled channels, a tool allowlist with per-tool permission (auto/ask/deny), and safety guardrails — ready to hand to an OpenClaw-style runtime.4---56# Workflow78When this skill is invoked, the user provides a plain-English description of the assistant they want to deploy. Your job is to parse that description and emit a complete, valid assistant configuration JSON that an OpenClaw-style runtime can consume directly.910This skill produces the configuration only. Deploying the assistant, provisioning channel credentials, and wiring tool integrations to live services are out of scope — that is the productionization gap the operator bridges after receiving this config.1112## Step 1 — Extract the assistant intent1314Read the user's description carefully and extract every distinct component:1516- **Persona:** What tone, name, and purpose should the assistant have? Extract a concise persona string — the assistant's "character" in one to two sentences.17- **Channels:** Which messaging surfaces should the assistant be active on? Identify each channel type (e.g., slack, email, sms, whatsapp, discord, web_chat, teams) and any scope constraints per channel (e.g., "read-only in #support", "only DMs from customers").18- **Desired capabilities:** What should the assistant be able to do? List every distinct action mentioned — read tickets, draft replies, look up orders, update CRM records, send messages, trigger webhooks, etc.19- **Explicit restrictions:** What should the assistant never do without confirmation, or never do at all? If the user says "must ask before sending", "never delete", "never make payments" — note these as explicit deny or ask constraints.20- **Audience:** Who interacts with this assistant? (Customers, internal team, developers.) This informs the persona tone and default safety posture.2122If a constraint is not mentioned, default to the safe side: outbound messages and any write operations default to `"ask"`, financial or destructive operations default to `"deny"`.2324## Step 2 — Build the tool allowlist2526Map each capability identified in Step 1 to a named tool. Assign a permission level to each tool:2728- `"auto"` — the assistant may invoke this tool without asking the user, for clearly safe read operations (e.g., `read_tickets`, `search_knowledge_base`, `get_order_status`).29- `"ask"` — the assistant must present the proposed action to the user for confirmation before executing, for any outbound message, write to an external system, or moderately sensitive read (e.g., `send_email`, `post_slack_message`, `update_crm_record`, `reply_to_ticket`).30- `"deny"` — the assistant may never invoke this tool, for financial, destructive, or privileged operations (e.g., `make_payment`, `delete_record`, `admin_impersonate`).3132Include a `reason` string on every tool explaining the permission decision. Always include a `make_payment` tool set to `"deny"` and a `delete_record` tool set to `"deny"` as baseline safety anchors — even if the user did not mention them — to demonstrate the default-deny posture.3334## Step 3 — Define guardrails3536Produce a `guardrails` block with these fields:3738- `default_tool_permission` — always `"deny"`. Any tool not in the allowlist is denied by default.39- `max_actions_per_run` — a reasonable ceiling on consecutive autonomous actions (suggest 25 unless the user implies a higher-volume use case).40- `require_confirmation_for` — an array of operation categories that always require user confirmation regardless of individual tool permission. At minimum: `["outbound_message", "payment", "data_deletion"]`.41- `redact_pii_in_logs` — always `true` unless the user explicitly says logs may contain PII.4243## Step 4 — Define the escalation policy4445Produce an `escalation` block specifying what happens when the assistant is uncertain or blocked:4647- `to` — `"human"` by default.48- `when` — an array of trigger conditions. At minimum: `["ambiguous_request", "tool_denied", "low_confidence"]`. Add `"sensitive_topic"` if the audience is customers. Add `"escalation_keyword"` if the user mentions words like "urgent", "legal", "compliance".4950## Step 5 — Assemble and self-check the JSON config5152Emit a single JSON object with this shape:5354```55{56 "assistant": {57 "name": "<assistant name>",58 "persona": "<one-to-two sentence persona description>",59 "description": "<one-sentence functional summary>"60 },61 "channels": [62 { "type": "<channel_type>", "enabled": true, "scope": "<scope constraint or 'all'>" }63 ],64 "tools": [65 {66 "name": "<tool_name_in_snake_case>",67 "permission": "auto | ask | deny",68 "reason": "<plain-English explanation of why this permission level>"69 }70 ],71 "guardrails": {72 "default_tool_permission": "deny",73 "max_actions_per_run": 25,74 "require_confirmation_for": ["outbound_message", "payment", "data_deletion"],75 "redact_pii_in_logs": true76 },77 "escalation": {78 "to": "human",79 "when": ["ambiguous_request", "tool_denied", "low_confidence"]80 }81}82```8384Before emitting, verify:8586- Every tool in the `tools` array has a non-empty `name`, a `permission` value from the allowed set (`auto`, `ask`, `deny`), and a non-empty `reason`.87- `make_payment` and `delete_record` are present with `permission: "deny"`.88- Every channel in `channels` has a `type` and an `enabled` boolean.89- `guardrails.default_tool_permission` is `"deny"`.90- `require_confirmation_for` includes at minimum `"outbound_message"`, `"payment"`, and `"data_deletion"`.91- The document is syntactically valid JSON — no trailing commas, no comments, no single-quoted strings.9293If any check fails, fix it before emitting.9495## Safety-first design principle9697The configuration follows a **default-deny** posture: any tool not explicitly listed in `tools[]` is automatically denied. Outbound actions (messages, emails, posts) and any write to an external system require explicit user confirmation (`"ask"`) unless the user explicitly grants auto-approval. Financial and destructive operations are always `"deny"`. This mirrors the "safe" pillar in Klaus AI's hosted assistant design and the OpenClaw runtime's permission model.9899## Example100101See `examples/input.md` for a plain-English assistant request (a customer support assistant on Slack and email that reads tickets and drafts replies but must ask before sending anything external).102103See `examples/output.md` for the complete, valid JSON assistant configuration this skill produces from that input.