MemClaw / docs
Skill Factory

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.*

KeyDefaultPurpose
enabledfalseMaster opt-in. Off = legacy no-op (no gating, Forge, or Inbox).
description_max_bytes160Cap on a skill's description.
inbox_max_pendingCap on staged skills the Inbox lists.
rejection_cooloff_daysPoison-table cool-off after a reject.
forge.cron_interval_hours6Informational; your scheduler sets the real cadence.
forge.min_cluster_size3Volume gate threshold.
forge.min_distinct_agents3Diversity gate threshold.
forge.freshness_window_days14Freshness gate threshold (days).
sentinel.auto_promote_cleanfalseSkip 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):

GateCheckDefault
volumeorigin.cluster_size ≥ min_cluster_size3
diversityorigin.distinct_agents ≥ min_distinct_agents3
freshnesscluster window within forge.freshness_window_days14
poisonfingerprint not in the reject poison table
scandata.scan.state == 'clean'
hash_bindingfor kind='update', target hash still matches

Endpoints

Method · PathPurposePage
POST /api/v1/skills/installableActive-only catalog for harness pushDelivery
GET /api/v1/skills-inbox/List staged skillsInbox
POST /api/v1/skills-inbox/{slug}/approvestaged → activeInbox
POST /api/v1/skills-inbox/{slug}/editRevise + re-scan; stays stagedInbox
POST /api/v1/skills-inbox/{slug}/rejectstaged or quarantinedrejected + cool-offInbox
POST /api/v1/skills-inbox/{slug}/quarantinestaged → quarantinedInbox
POST /api/v1/skills-inbox/{slug}/deferStay staged; push down queueInbox
POST /admin/lifecycle/fanout/forge-distillTrigger a Forge tick per opted-in tenantForge

(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 use agent; manual is admin-only; forge is worker-only; imported is migration-only — see Authoring).

  • slug matches ^[a-z0-9][a-z0-9._-]{0,99}$ and equals the doc_id.

  • kind{ create, update }; an update carries target.target_content_hash.

  • descriptiondescription_max_bytes (default 160); content ≤ 40,000 bytes.

  • summary is 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-owned entries).
  • register: true → adds dir to skills.load.extraDirs in openclaw.json.

Detail: OpenClaw plugin.

Where to look in the source