界面已本地化;技能介绍与说明文档按所选语言由 AI 自动翻译,代码、命令、路径和专业术语保留原文,以原作者文档为准。
探索技能
开发与工程 · SKILL.md

skill-lifecycle

skill-lifecycle

【开发与工程】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.

独立 GitHub 快照 · 自动分类 · 以原作者文档为准

Iiflytek / skillhubApache-2.0

技能说明

GitHub

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):

ValueMeaning
ACTIVESkill is operational and can have versions published
HIDDENSkill hidden by platform governance (design doc says prefer boolean hidden flag instead)
ARCHIVEDSkill 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):

ValueMeaning
DRAFTNon-public draft, can resubmit or delete
SCANNINGUndergoing security scan
SCAN_FAILEDSecurity scan failed
UPLOADEDUploaded but not yet submitted for review (or withdrawn from review)
PENDING_REVIEWFrozen pending reviewer action
PUBLISHEDCurrently distributable
REJECTEDReview denied, retained
YANKEDWas published, withdrawn from distribution

ReviewTask States

Enum ReviewTaskStatus (domain/review/ReviewTaskStatus.java):

ValueMeaning
PENDINGAwaiting reviewer
APPROVEDReviewer approved
REJECTEDReviewer rejected

Visibility Model

Enum SkillVisibility (used in SkillPublishService):

ValuePublish Path
PUBLICCreates PENDING_REVIEW version, review task, security scan
NAMESPACE_ONLYSame as PUBLIC but limited visibility scope
PRIVATEGoes 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

ActionFromToNotesSource
First upload (PUBLIC/NAMESPACE_ONLY)—PENDING_REVIEWReview task createdSkillPublishService
First upload (SUPER_ADMIN)—PUBLISHEDDirect publish, SkillPublishedEvent emittedSkillPublishService
First upload (PRIVATE)—UPLOADEDNo review task, latestVersionId updatedSkillPublishService
Review approvePENDING_REVIEWPUBLISHEDUpdates latestVersionIdReview workflow
Review rejectPENDING_REVIEWREJECTEDVersion retainedReview workflow
Withdraw reviewPENDING_REVIEWUPLOADEDDeletes pending ReviewTaskSkillGovernanceService.withdrawPendingVersion
YankPUBLISHEDYANKEDRecalculates latestVersionIdSkillGovernanceService.yankVersion
Hide—hidden=trueIndependent overlaySkillGovernanceService.hideSkill
Restore—hidden=falseIndependent overlaySkillGovernanceService.unhideSkill
ArchiveACTIVEARCHIVEDSkillStatusChangedEvent emittedSkillGovernanceService.archiveSkill
UnarchiveARCHIVEDACTIVESkillStatusChangedEvent emittedSkillGovernanceService.unarchiveSkill
New publish (existing pending)PENDING_REVIEWUPLOADEDAuto-withdraw + delete review taskSkillPublishService
Delete versionDRAFT/REJECTED/SCAN_FAILED/UPLOADED—Last version protectedSkillGovernanceService.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

ActionWho
Withdraw reviewSubmitter only
Delete versionOwner or namespace admin, only DRAFT/REJECTED/SCAN_FAILED/UPLOADED
Archive/unarchiveOwner or namespace admin (ADMIN or OWNER role)
Hide/restorePlatform governance (no permission check in code)
YankPlatform governance (no permission check in code)
Publish PUBLIC skillNamespace member (or SUPER_ADMIN)
Publish PRIVATE skillNamespace 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 deleted version was the pointer
  • Storage deletion happens after transaction commit with compensation recording

Domain Events

EventWhen Emitted
SkillStatusChangedEventArchive or unarchive
SkillPublishedEventSUPER_ADMIN direct publish
SkillVersionYankedEventYank action
ReviewSubmittedEventCreate review task for PUBLIC/NAMESPACE_ONLY

Common Pitfalls

  • Setting SkillStatus.HIDDEN directly — use skill.setHidden(true) via SkillGovernanceService instead
  • Forgetting to recalculate latestVersionId after yank or version deletion
  • Not auto-withdrawing pending versions when publishing a new version
  • Missing the confirmWarnings two-step publish flow (warnings require explicit confirmation)
  • Assuming all publish flows create review tasks — PRIVATE visibility skips review
我的收藏