Skill LifecycleSAFE
Self-hosted, open-source agent skill registry for enterprises. Publish & version skill packages, govern with RBAC and audit logs, deploy on-premise with Docker or Kubernetes.
Overview
Self-hosted, open-source agent skill registry for enterprises. Publish & version skill packages, govern with RBAC and audit logs, deploy on-premise with Docker or Kubernetes.
e94027cda310OBSERVED · 2026-10-11Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| openclaw | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
--- name: skill-lifecycle description: The authoritative skill lifecycle state model including container states, version states, review workflow states, visibility overlay, and governance actions. Ensures agents don't introduce invalid states or transitions. license: Apache-2.0 --- # Skill Lifecycle Skill ## Trigger Use this skill when: - Modifying skill publish, review, or unpublish flows - Adding or changing skill/version status fields - Working on search, detail pages, or listing pages that show skill state - Implementing governance actions (hide, yank, archive) - Adding new state transitions or permission checks ## State Model ### Skill Container States Enum `SkillStatus` (`domain/skill/SkillStatus.java`): | Value | Meaning | |-------|---------| | `ACTIVE` | Skill is operational and can have versions published | | `HIDDEN` | Skill hidden by platform governance (design doc says prefer boolean `hidden` flag instead) | | `ARCHIVED` | Skill archived by owner/namespace admin, cannot publish new versions | **Design-vs-code note**: `docs/14-skill-lifecycle.md` specifies `hidden` should be a governance overlay (boolean flag) rather than a lifecycle enum state. The current code still defines `SkillStatus.HIDDEN`. New code should use the `skill.hidden` boolean field, not the enum value. ### SkillVersion States Enum `SkillVersionStatus` (`domain/skill/SkillVersionStatus.java`): | Value | Meaning | |-------|---------| | `DRAFT` | Non-public draft, can resubmit or delete | | `SCANNING` | Undergoing security scan | | `SCAN_FAILED` | Security scan failed | | `UPLOADED` | Uploaded but not yet submitted for review (or withdrawn from review) | | `PENDING_REVIEW` | Frozen pending reviewer action | | `PUBLISHED` | Currently distributable | | `REJECTED` | Review denied, retained | | `YANKED` | Was published, withdrawn from distribution | ### ReviewTask States Enum `ReviewTaskStatus` (`domain/review/ReviewTaskStatus.java`): | Value | Meaning | |-------|---------| | `PENDING` | Awaiting reviewer | | `APPROVED` | Reviewer approved | | `REJECTED` | Reviewer rejected | ### Visibility Model Enum `SkillVisibility` (used in `SkillPublishService`): | Value | Publish Path | |-------|-------------| | `PUBLIC` | Creates `PENDING_REVIEW` version, review task, security scan | | `NAMESPACE_ONLY` | Same as PUBLIC but limited visibility scope | | `PRIVATE` | Goes directly to `UPLOADED` status, no review task | `SUPER_ADMIN` role bypasses review — versions go directly to `PUBLISHED`. ### Latest Version Pointer `Skill.latestVersionId` is **only** the latest published pointer: - Can only point to a `PUBLISHED` version - May be `null` if no published version exists - `latest` tag auto-follows this pointer (read-only) - When yanking: recalculates to newest remaining `PUBLISHED` version, or `null` ### Key Transitions | Action | From | To | Notes | Source | |--------|------|-----|-------|--------| | First upload (PUBLIC/NAMESPACE_ONLY) | — | `PENDING_REVIEW` | Review task created | `SkillPublishService` | | First upload (SUPER_ADMIN) | — | `PUBLISHED` | Direct publish, `SkillPublishedEvent` emitted | `SkillPublishService` | | First upload (PRIVATE) | — | `UPLOADED` | No review task, `latestVersionId` updated | `SkillPublishService` | | Review approve | `PENDING_REVIEW` | `PUBLISHED` | Updates `latestVersionId` | Review workflow | | Review reject | `PENDING_REVIEW` | `REJECTED` | Version retained | Review workflow | | Withdraw review | `PENDING_REVIEW` | `UPLOADED` | Deletes pending `ReviewTask` | `SkillGovernanceService.withdrawPendingVersion` | | Yank | `PUBLISHED` | `YANKED` | Recalculates `latestVersionId` | `SkillGovernanceService.yankVersion` | | Hide | — | `hidden=true` | Independent overlay | `SkillGovernanceService.hideSkill` | | Restore | — | `hidden=false` | Independent overlay | `SkillGovernanceService.unhideSkill` | | Archive | `ACTIVE` | `ARCHIVED` | `SkillStatusChangedEvent` emitted | `SkillGovernanceService.archiveSkill` | | Unarchive | `ARCHIVED` | `ACTIVE` | `SkillStatusChangedEvent` emitted | `SkillGovernanceService.unarchiveSkill` | | New publish (existing pending) | `PENDING_REVIEW` | `UPLOADED` | Auto-withdraw + delete review task | `SkillPublishService` | | Delete version | `DRAFT`/`REJECTED`/`SCAN_FAILED`/`UPLOADED` | — | Last version protected | `SkillGovernanceService.deleteVersion` | ### Yank Pointer Recalculation When yanking the current `latestVersionId` (`SkillGovernanceService`): 1. Query all remaining `PUBLISHED` versions for the skill 2. Sort by `publishedAt` DESC, then `createdAt` DESC, then `id` DESC 3. Point `latestVersionId` to the top result, or `null` if none remain ### Lifecycle Projection Read models (detail, my-skills, favorites, search) use `*QueryRepository` patterns: - `headlineVersion` — Main display version for the page - `publishedVersion` — Latest published version - `ownerPreviewVersion` — Pending review version (visible to owner/namespace admin) - `resolutionMode` — `PUBLISHED`, `OWNER_PREVIEW`, or `NONE` **Public browsing, install, download, search only use `publishedVersion`.** ### Permission Boundaries | Action | Who | |--------|-----| | Withdraw review | Submitter only | | Delete version | Owner or namespace admin, only `DRAFT`/`REJECTED`/`SCAN_FAILED`/`UPLOADED` | | Archive/unarchive | Owner or namespace admin (`ADMIN` or `OWNER` role) | | Hide/restore | Platform governance (no permission check in code) | | Yank | Platform governance (no permission check in code) | | Publish PUBLIC skill | Namespace member (or `SUPER_ADMIN`) | | Publish PRIVATE skill | Namespace member (or `SUPER_ADMIN`) | ### Delete Version Constraints `SkillGovernanceService.deleteVersion` enforces: - Only `DRAFT`, `REJECTED`, `SCAN_FAILED`, or `UPLOADED` versions can be deleted - Cannot delete the last remaining version of a skill - Deletes associated storage keys (individual files + `bundle.zip`) - Deletes associated security scan records - Updates `latestVersionId` if the
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | NA |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (0)
No findings outside the package's declared scope.
Gates applied: no_behavioural_pass.
e94027cda310full audit observations/trust-audit/skill/iflytek__skill-lifecycle.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | e94027cda310 | SAFE | B | 89 | first audit |
Questions
What does the Skill Lifecycle skill do?
Self-hosted, open-source agent skill registry for enterprises. Publish & version skill packages, govern with RBAC and audit logs, deploy on-premise with Docker or Kubernetes.
Is Skill Lifecycle safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can Skill Lifecycle access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does Skill Lifecycle work with?
Its documentation mentions openclaw. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (e94027cda310), read on 2026-10-11. The repository is watched, and a new audit runs when it changes — this is the first audit.