Reference
One-page reference for Skill Factory — config keys, statuses, auto-gates, endpoints, the skill schema, and the plugin target env var.
A consolidated quick-reference. See the linked pages for detail.
Config — org_settings.skills_factory.*
| Key | Default | Purpose |
|---|---|---|
enabled | false | Master opt-in. Off = legacy no-op (no gating, Forge, or Inbox). |
description_max_bytes | 160 | Cap on a skill's description. |
inbox_max_pending | — | Cap on staged skills the Inbox lists. |
rejection_cooloff_days | — | Poison-table cool-off after a reject. |
forge.cron_interval_hours | 6 | Informational; your scheduler sets the real cadence. |
forge.min_cluster_size | 3 | Volume gate threshold. |
forge.min_distinct_agents | 3 | Diversity gate threshold. |
forge.freshness_window_days | 14 | Freshness gate threshold (days). |
sentinel.auto_promote_clean | false | Skip the Inbox for clean, fully-gated candidates. |
Enable: PATCH org_settings { "skills_factory": { "enabled": true } }.
Statuses
candidate (Forge-only, never agent-visible) → staged (default for writes;
in the Inbox) → active (delivered). Side states: rejected, quarantined,
stale, deprecated (all system-set). Full RBAC in
Lifecycle.
The six auto-gates
candidate → staged requires all six (fail-closed):
| Gate | Check | Default |
|---|---|---|
| volume | origin.cluster_size ≥ min_cluster_size | 3 |
| diversity | origin.distinct_agents ≥ min_distinct_agents | 3 |
| freshness | cluster window within forge.freshness_window_days | 14 |
| poison | fingerprint not in the reject poison table | — |
| scan | data.scan.state == 'clean' | — |
| hash_binding | for kind='update', target hash still matches | — |
Endpoints
| Method · Path | Purpose | Page |
|---|---|---|
POST /api/v1/skills/installable | Active-only catalog for harness push | Delivery |
GET /api/v1/skills-inbox/ | List staged skills | Inbox |
POST /api/v1/skills-inbox/{slug}/approve | staged → active | Inbox |
POST /api/v1/skills-inbox/{slug}/edit | Revise + re-scan; stays staged | Inbox |
POST /api/v1/skills-inbox/{slug}/reject | staged or quarantined → rejected + cool-off | Inbox |
POST /api/v1/skills-inbox/{slug}/quarantine | staged → quarantined | Inbox |
POST /api/v1/skills-inbox/{slug}/defer | Stay staged; push down queue | Inbox |
POST /admin/lifecycle/fanout/forge-distill | Trigger a Forge tick per opted-in tenant | Forge |
(memclaw_doc op=search/query/read collection='skills' is the MCP pull surface.)
Skill schema (memclaw_doc op=write collection='skills')
Required data keys: name, slug, description, domain, kind, source.
content is required for every normal write; the only exception is the
internal source='imported' back-compat path.
-
source∈{ agent, manual, forge, imported }— required and role-enforced (a regular caller must useagent;manualis admin-only;forgeis worker-only;importedis migration-only — see Authoring). -
slugmatches^[a-z0-9][a-z0-9._-]{0,99}$and equals thedoc_id. -
kind∈{ create, update }; anupdatecarriestarget.target_content_hash. -
description≤description_max_bytes(default 160);content≤ 40,000 bytes. -
summaryis the embedded (searchable) field — write a trigger-shaped sentence.
Detail: Authoring.
Plugin target env var
MEMCLAW_SKILL_TARGETS — JSON array of { dir, mode, register? }:
mode:owned(destructive prune) |additive(only touches.memclaw-ownedentries).register: true→ addsdirtoskills.load.extraDirsinopenclaw.json.
Detail: OpenClaw plugin.
Where to look in the source
- Lifecycle, gates, schema validation:
skill_lifecycle.py - Inbox:
skills_inbox.py - Forge:
services/forge/ - Push delivery + reconciler:
documents.py,reconcile-skills.ts
OpenClaw plugin delivery
How the OpenClaw plugin's reconciler pushes active skills onto a node — managed vs shared target dirs, the ownership marker, registering on the load path, and per-node observability.
For Agents
The MemClaw skill — the canonical prompt LLM agents follow when they have memclaw_* tools. Fetch the plain Markdown at /docs/agents.md.