Install
openclaw skills install @indigokarasu/ocas-skilllabSkill library maintenance: audit, merge, rename, delete, consolidate, publish, sanitize, and critique skills. Interactive menu via clarify tool. Scans ALL profile directories recursively — never hardcodes a single path. Use when the user asks to clean up the skill library, merge overlapping skills, rename skills to follow naming conventions, delete auto-generated or stale skills, audit skills for authorship, publish skills to external registries, sanitize skills for security scanner compliance, score skills against the 10-dimension rubric, generate improvement plans, or run autonomous library grinding (10khr). Also covers frontmatter conventions and how to identify skills by type (ocas-*, util-*, protected, auto-generated). NOT for: building or debugging a skill's own scripts (that is not a library task), running code autofix on skill source, or writing arbitrary code unrelated to the skill library.
openclaw skills install @indigokarasu/ocas-skilllabSkill library maintenance: audit, merge, rename, delete, consolidate, publish, sanitize.
The library should hold class-level umbrellas, not micro-skills — prefer one broad skill with labeled subsections over five narrow siblings.
Read references/support-file-map.md first — full 60+ entry index with per-task "When to read" pointers.
When invoked interactively, present a menu using the clarify tool: Audit, Critique, Merge, Rename, Delete, Publish, Sanitize, Hygiene, Exit. Pattern: references/interactive-menu.md.
ocas-* — OCAS family, authored by . util-* — utility skills, same author.ocas-*/util-* unless asked; discover via recursive glob across ALL profiles (why: flat scans silently miss whole profiles); protected = bundled/hub-installed (DO NOT edit); auto-generated (metadata.hermes.generated_by) = DELETE; author lives in BOTH author: and metadata.author:.Checklist:
generated_by) flagged---)bash scripts/secret-scan.sh <dir> → exit 0)references/sanitize-public-prose-rules.md; scrub: references/skill-sanitize-checklist.md). Why: references must abstract to reusable knowledge — session filenames and contacts leak private context publicly.Reviewing/critiquing/auditing a skill; iterating toward a target score; pre-publish quality gate; batch library audits; autonomous 10khr grinding.
Score against the 10-dimension rubric (references/critique-rubric.md), fix to 50/50.
Local eval runner (skillgrade): Integrate the skillgrade CLI tooling for local, offline evaluation of a skill's eval.yaml suite (references/evals/eval.yaml) prior to submitting variants. Run skillgrade against the local suite to validate behavior against the challenger variant before it is proposed to Monitor/Fellow — this is the gate between a candidate patch and a formal ocas-fellow benchmark. If a skill lacks references/evals/eval.yaml, note its absence in the critique rather than skipping evaluation entirely. See spec-ocas-skill-improvements.md §1.
Example score row: | D6 | 3 | rules lack "why" | — gap named.
| Command | What it does |
|---|---|
critique.assess <path> | Score only |
critique.plan <path> | Score + improvement plan |
critique.run <path> | Score → fix → verify |
critique.iterate <path> | Fix-verify loop until 50/50 |
critique.batch [paths] | Ranked table of multiple skills |
critique.perfect <skill> | Grind one skill to 50/50 |
critique.10khr | Autonomous library grinding |
Critique checklist:
python3 scripts/critique_code_ratio.py <path>/SKILL.md, target <20%); score D1–D10; print table (bands A=40–50 … F=0–9)references/critique-issue-categorization.md)references/critique-improvement-plan-template.md){agent_root}/.references/critique-audit-checklist.md)Reject rationalizations ("come back later", "skip minors", "good enough"). Marker: <critique-complete>.
python3 scripts/10khr_cron_verify.py FIRST in any autonomous pass — its output is authoritative for what to grind (do NOT also import the runner and re-walk mtimes by hand)Rules:
last_run AND heuristic ≥44, skip it. All unmodified ≥44 ⇒ stop.--report-only when you need the skip rule intact (why: it rewrites last_run to now, making every skill read as modified). Import the module and call run_full_assessment() without save_state instead.references/skilllab-pitfalls.md ("Extracted" appendix) + references/critique-10khr-grind-pitfalls.md; cron constraints: references/cron-grind-resilience.md. When to read: any grind misbehavior.| Failure | Symptom | Handling |
|---|---|---|
| Frontmatter won't parse after an edit | yaml.safe_load ScannerError; runner drops D1→1, D2→3 | A programmatic slice consumed the closing ---. Re-insert it at the boundary; validate with yaml.safe_load(content.split('---')[1]); re-run the scorer. |
| Degraded read mode | read_file/skill_view fail cluster-wide | Switch reads to terminal() (cat/sed -n/grep -n); writes still work. Do NOT abort. |
Script --help crashes | exits non-zero | Move the help guard BEFORE any module-level side effect (argv read, top-level I/O, dependency import). Verify by execution, not ast.parse. |
| Duplicate header after extraction | same ### Heading twice | Run grep -nE '^#{2,3} ' SKILL.md; collapse twins. |
| State claims 50/50 but disk says otherwise | state file vs on-disk mismatch | Re-score the actual files; status ≠ evidence. |
| Bulk edit corrupts many scripts | several scripts stop parsing | Recover git checkout -- . per repo. NEVER git clean -fd (deletes untracked work). Fix one file at a time, verifying after each. |
Right test: would a maintainer write N skills or one skill with N labeled sections? If the latter, merge.
Steps when absorbing B into A:
metadata.merged-from: <B> + B's triggers to A$HERMES_HOME/../indigo/skills/.archive/<B>/Package integrity: never flatten only SKILL.md while leaving support files behind. Parallel-copy dedupe: 7-step superset-verified procedure in references/merge-parallel-copy-dedupe.md — read before ANY cross-tree dedupe; never delete a tree until its Step-3 check reports 0 missing files (why: trees diverge silently; blind deletion destroys data).
mv $HERMES_HOME/../indigo/skills/<old-name> $HERMES_HOME/../indigo/skills/<new-name>
Update checklist (missing any causes stale refs):
name: frontmatter, heading, self-references, support file map.skills_prompt_snapshot.json + .usage.json keys renamed (snippets: references/rename-cache-updates.md) — why: stale keys persist in the system prompt until refreshNew skill: create dir → delete .skills_prompt_snapshot.json (regenerates; else never indexed) → sibling relationships → cron if scheduled → gateway restart.
Read source: BEFORE any repo operation — monorepo target ⇒ sync the subdir, never create a standalone repo (why: orphan repos the source: field doesn't reference).
Workflow: check source: → spec compliance (references/skill-publish-spec-compliance-checklist.md; agentskills.io requires name + keyword-rich description; strip Hermes-only extensions) → sanitize PII → standalone only: repo create + LICENSE/README/.gitignore → push → public.
GitHub mechanics:
references/skill-publish-github-push-recipe.md; bulk sync: references/skill-publish-github-sync-existing-skills.mdgh auth setup-git once, retry (why: git isn't using the gh token by default)skill-sync-all (04:00) running skill-sync-all.sh (indigo automation dir), superseding the paused ocas-skilllab-sync + monorepo-skill-sync. Discovers ocas/util/eng skills by rule (references/skill-sync-discovery.md); idempotent; sets agent identity.--working-tree secret-scan mode (full history false-blocks pushes over old committed prose); full mode only for pre-publish auditsShare to Nous optional-skills: full procedure (config-policy gate, category table, prerequisites) in references/skilllab-share-procedure.md — When to read: immediately before preparing any submission.
Policy: no secrets in local/remote skills except the private backup repo — and even there, secrets belong in env files, not skills. A skill is NOT committable until bash scripts/secret-scan.sh <dir> exits 0.
bash scripts/secret-scan.sh <dir> # tree + .git/config + ALL history
bash scripts/secret-scan.sh --working-tree <dir> # skip history (sync gates)
Remediation (history rewrite, rotation): references/secret-history-rewrite.md — read when the gate exits 1 on a real secret. False positives = example credential-shaped text: redact or move to a reference. Output is masked — never grep for the masked string; search the real substring via Python str.replace() (why: sed/perl metacharacters silently no-op).
Minimum: name, description, license (right after name), includes: if support dirs exist, triggers: for discoverability. Nest metadata.hermes properly (metadata:\n hermes:\n category:) — a literal top-level metadata.hermes: key still scores D1=4. Full reference: references/skilllab-frontmatter-standards.md.
Full list (60+, plus extracted dated narratives): references/skilllab-pitfalls.md.
- [ ] checklists for any 3+ step procedure; numbered steps don't count.--help exiting 0; guard must precede module-level side effects; bash guards define every downstream variable under set -u. Pattern: references/critique-10khr-d9-help-injection.md._backup_<date>/ first. List skills from the filesystem, tersely — never from memory.os.listdir() or flat globs.cross_profile=True after confirming the owning profile.git checkout -- ., never git clean -fd.New external tool systems follow references/tool-integration-pattern.md (docs → map to existing skills → delegate → build new only at 24+ commands; pitfall: over-integration).
Retire a capability: grep old name → classify refs (prose→replace, section→remove, logs→leave) → rename support files + cache keys → re-grep to confirm zero refs (excluding .archive/).