feat(skills): add Skill package schema and agent-side skill loading support #88
Open
opened 2026-07-31 18:08:19 +00:00 by CoreRasurae
·
1 comment
No Branch/Tag Specified
Labels
Clear labels
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Needs Feedback
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
PR blocked by an open issue dependency. Operator must close the dep (or remove the dependency link) before the merge driver can act. Auto-cleared by merge_drive when no open deps remain.
Most recent merge cycle hit CI timeout. Driver excludes this PR while last merge_cycle row is < 30 min old; label persists thereafter as visible history.
Currently being processed by an implementer worker.
Currently being processed by the merge driver.
Currently being processed by a reviewer worker.
Merge driver heartbeat stale; pipeline halted. Closed automatically on next clean tick.
Detected master commit violating the strict merge invariant. Tracked as an issue (not a PR label); kept here for label completeness.
In-cycle escalation: most recent attempt ran at the Tier 0 slot (`tier-0`). Slot's model defined in .opencode/models/tiers.yaml.
In-cycle escalation: most recent attempt ran at the Tier 1 slot (`tier-1`). Slot's model defined in .opencode/models/tiers.yaml.
In-cycle escalation: most recent attempt ran at the Tier 2 slot (`tier-2`). Slot's model defined in .opencode/models/tiers.yaml. Gated behind IMPLEMENTER_ESCALATION_TIER2_ENABLED.
In-cycle escalation: most recent attempt ran at the Tier -1 slot (`tier-min`). Slot's model defined in .opencode/models/tiers.yaml. Suffix is ``-min`` (not ``--1``) so the Forgejo UI reads naturally.
Tracking issues used by the AI Automation system for agents to communicate and report.
Rebase conflict needs LLM conflict-resolver.
Failing CI needs implementer attention.
Documenting a driver incident or rollback.
Reviewer has APPROVED this PR and no later REQUEST_CHANGES is outstanding. The merge driver requires this label to even consider a PR for merging. Set by the reviewer worker on APPROVE; cleared on REQUEST_CHANGES.
Train repeatedly lost master-tempo races. Driver excludes via merge_cycle until cooldown elapses; label persists as visible history.
Revert PR backing out an invariant violation. Fast-tracked through the merge driver.
Sentinel PR duplicated from upstream into a personal fork by tools/duplicate_prs_to_fork.py for pipeline testing. Lives only in the fork; the canonical pipeline never sees it.
No implementer activity for N days. Flagged for human review. Auto-cleared on next push to head branch.
Repeatedly fails on current master (>= 3 ci-fail-on-rebased-sha releases in 12 h). Excluded from driver until human triage.
A ticket in a blocked state and unable to complete until some other task is completed first.
Bounty
$100
A bounty of $100 for any open-source contributor who provides a MR that solves this issue
Bounty
$1000
A bounty of $1000 for any open-source contributor who provides a MR that solves this issue
Bounty
$10000
A bounty of $10000 for any open-source contributor who provides a MR that solves this issue
Bounty
$20
A bounty of $20 for any open-source contributor who provides a MR that solves this issue
Bounty
$2000
A bounty of $2000 for any open-source contributor who provides a MR that solves this issue
Bounty
$250
A bounty of $250 for any open-source contributor who provides a MR that solves this issue
Bounty
$50
A bounty of $50 for any open-source contributor who provides a MR that solves this issue
Bounty
$500
A bounty of $500 for any open-source contributor who provides a MR that solves this issue
Bounty
$5000
A bounty of $5000 for any open-source contributor who provides a MR that solves this issue
Bounty
$750
A bounty of $750 for any open-source contributor who provides a MR that solves this issue
MoSCoW
Could have
Could have feature in order to satisfy the epic/legendary.
MoSCoW
Must have
Must have feature in order to satisfy the epic/legendary.
MoSCoW
Should have
Should have feature in order to satisfy the epic/legendary.
There are questions in the ticket that can not be completed until the project owner provides clarity.
Points
1
1 man-hours worth of work for an expert with no learning curve.
Points
13
13 man-hours worth of work for an expert with no learning curve.
Points
2
2 man-hours worth of work for an expert with no learning curve.
Points
21
21 man-hours worth of work for an expert with no learning curve.
Points
3
3 man-hours worth of work for an expert with no learning curve.
Points
34
34 man-hours worth of work for an expert with no learning curve.
Points
5
5 man-hours worth of work for an expert with no learning curve.
Points
55
55 man-hours worth of work for an expert with no learning curve.
Points
8
8 man-hours worth of work for an expert with no learning curve.
Points
88
88 man-hours worth of work for an expert with no learning curve.
Priority
Backlog
This ticket has backlogged priority and is not to be worked on yet
Priority
CI Blocker
Critical priority issue that blocks CI/CD pipeline and prevents PR merges
Priority
Critical
The priority is critical
Priority
High
The priority is high
Priority
Low
The priority is low
Priority
Medium
The priority is medium
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
A ticket for learning a tool or technology that is needed to be able to do future planning and design.
State
Completed
The ticket has been fully implemented, completed, and merged with the source code. This label should only be applied once a ticket is closed.
State
Duplicate
A ticket that represents the same content as an existing ticket.
State
In Progress
A ticket that is actively being developed.
State
In Review
A ticket that has had some code completed to implement but is waiting to pass peer review and is not yet merged in.
State
Paused
This ticket's work started but wasn't finished. It's on hold (likely in a feature branch) and will be resumed later, either due to a blocker or a delay.
State
Unverified
All new tickets start in this state. A developer may set it to show the ticket is unverified. This means we haven't agreed to work on it. It will either move to a verified state or be closed as wontdo.
State
Verified
The issue has been verified by a developer as legitimate. It will be worked on and verified tickets are now considered part of the backlog.
State
Wont Do
This ticket has been decided it wont be done. This may mean the bug has been determined to not be real (cant verify) or the feature is one we have decided we dont want to adopt.
Type
Automation
Any edits or discussion about the AI automated coding system.
Type
Bug
Something that doesnt work as intended.
Type
Discussion
Anytime a ticket represents a discussion about a subject and doesnt fall into one of the other categories.
Type
Documentation
An error or improvement needed in the documentation.
Type
Epic
Any first tier epic. That is, an epic which contains only issues as children and will not have sub-epics.
Type
Feature
Some new functionality not present.
Type
Legendary
A type of Epic which will contain other Epics.
Type
Refactor
A code change that restructures existing code without changing its external behavior.
Type
Support
Someone needs help using the project.
Type
Task
A generic task that doesnt fit into the other type categories.
Type
Testing
Work exclusively focusing on fixing or expanding testing.
Projects
Clear projects
No project
Assignees
aditya (Aditya Chhabra)
aleenaumair (Aleena Umair)
brent.edwards (Brent Edwards)
CoreRasurae (Luis Mendes)
drew (Drew Morris)
eugen.thaci (Eugen Thaci)
freemo (Jeffrey Phillips Freeman)
HAL9000 (HAL 9000)
HAL9001 (HAL9001)
hamza.khyari (Hamza Khyari)
hurui200320 (Rui Hu)
justin.morris
khird (Kyle Hird)
org.cleveragents
Clear assignees
No Assignees
CoreRasurae
Notifications
Due Date
No due date set.
Blocks
Depends on
#22 Epic: Package Registry Client — Support Package Registry Standard v1.0.0
cleveragents/cleveractors-core
#94 feat(skills): add skill package schema and agent-side skill loading support
cleveragents/cleveractors-core
Reference: cleveragents/cleveractors-core#88
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Metadata
feat(skills): add skill package schema and agent-side skill loading supportfeature/skill-package-supportBackground and context
The Package Registry Standard (§3.2) already defines
skillas a first-class package type (prefixpkg_skl_, description "Skill packagesdefining capabilities for AI agents"), and it appears throughout the registry client docs
(
docs/registry/*.md) as an example package type resolved through the same generic API asactor,graph,agent, andtemplatepackages.However, two things are missing:
actorpackages (which conform to theActor Configuration Standard,
docs/index.md), askillpackage has no defined internalstructure beyond the generic package requirements (name, description). There is no
specification for what fields a skill must declare or how they should be interpreted.
docs/index.md§4.4, LLM Agents) has no
skillsconfiguration field or any other mechanism for an Actorto reference and load a Skill package into an agent. The generic
cleveractors.registryclient (PackageContentResolver,RegistryCache,ReferenceResolver) can already fetch askill-typed package by reference, but nothing incleveractors.agentscalls it — resolved skill content has nowhere to attach.This Epic (#22) delivered the generic, package-type-agnostic registry client. This issue
covers extending that work so
skillpackages become a fully supported, structurallydefined, and actually consumable capability — not just an enum value used in examples.
External reference specification — agentskills.io
Before designing our own schema, the ADR must consult the open Agent Skills
format at https://agentskills.io/home and its normative specification at
https://agentskills.io/specification. This format was originally developed by
Anthropic, released as an open standard, and is now supported by a large number of
agentic clients (Claude Code, Claude, OpenAI Codex, Gemini CLI, Cursor, GitHub Copilot,
VS Code, Goose, OpenHands, and dozens of others — see the client showcase at
agentskills.io). Aligning with it (rather than inventing an incompatible schema) means
cleveractors could consume/produce skills that interoperate with this existing ecosystem.
Key points from the specification that the ADR must account for:
SKILL.mdfile; it may also contain
scripts/(executable code),references/(additionaldocs),
assets/(templates/data), and arbitrary other files:is a single canonicalized YAML document, content-addressed as one SHA-1 blob
(§6 of
docs/actor-registry-standard.md). The ADR must resolve this — e.g. bydefining a directory→single-document packing convention (inline file contents as a
mapping field, tar+base64 encode the tree, extend canonicalization to hash a file
tree, etc.) — before a
pkg_skl_package can faithfully round-trip anagentskills.io-conformant skill.
SKILL.mdfrontmatter fields (YAML frontmatter + Markdown body):namedescriptionlicensecompatibilitymetadataallowed-toolsname+descriptionloaded at startup, for allskills.
SKILL.mdbody is loaded into context once a task matchesa skill's description (recommended to stay under ~5000 tokens / 500 lines).
scripts//references//assets/files are loaded/run onlyas needed.
skills-refCLI(
skills-ref validate ./my-skill) that validates frontmatter and naming conventions —worth evaluating as a dependency or as a model for our own validation.
Expected behavior
An Actor configuration author can declare skill references on a
type: llmagent, e.g.:At agent-creation time, each reference resolves through the existing
cleveractors.registryclient, the resolved content is validated against the Skillpackage schema defined by the ADR (which must itself be grounded in the agentskills.io
specification — see above), and the skill's
name/description/instructions(and, per progressive disclosure, its bundled scripts/references/assets on demand) are
loaded into the agent.
Acceptance criteria
skills:LLM agent config field, per this project's Specification-First Development process
(see ADR-2030 through ADR-2033 for the established ADR format and spec-extension
precedent). The ADR must explicitly evaluate the agentskills.io Agent Skills
specification (https://agentskills.io/specification) as the reference format,
document how our
pkg_skl_package schema maps to/from aSKILL.md-plus-directoryskill (including the single-document-vs-directory packaging question above), and
justify any deviation from the open spec.
docs/actor-registry-standard.md,specifying required/optional fields for
skill-type packages, informed by theagentskills.io frontmatter fields (
name,description,license,compatibility,metadata,allowed-tools) and the progressive-disclosure loading model.docs/index.md§4.4) documents a new optionalskillsfieldaccepting a list of package references using the existing reference schemes
(
registry:,ID:,local:).skillsentries resolve via the existingcleveractors.registryclient (
ReferenceResolver+PackageContentResolver+RegistryCache) and validateagainst the Skill schema, raising a typed error consistent with the existing
RegistryError/ExecutionErrorhierarchies on missing or invalid skill packages.and/or effective system prompt), consistent with the progressive-disclosure model
(name/description always available; full instructions loaded on activation).
skill package, invalid skill package content (including
name/descriptionconstraint violations per the agentskills.io rules), and a skill reference using each
of the three reference schemes.
skills:-configured LLMagent resolving a skill package end-to-end.
nox -s coverage_report); fullnoxsuite passes.docs/registry/) is updated to reflect the Skill schema andusage.
Supporting information
docs/actor-registry-standard.md§3.2 (package types), §5.3 (reference formats),§6 (canonicalization — single-document, content-addressed model)
docs/index.md§4.4 (LLM agent config), §1.3 (extensibility clause used by prior ADRs)docs/registry/index.md,docs/registry/integration.md(existing generic client usageof
package_type="skill"as an illustrative example only — no schema behind it today)open Agent Skills format (originally developed by Anthropic) that the ADR must
consult and evaluate for alignment; see "External reference specification" above for
the extracted normative details
specification-extension ADRs in this project
builds on
Subtasks
overview at https://agentskills.io/home) and summarize its applicability/gaps
relative to the Package Registry Standard's single-document packaging model
skills:LLM agent config field, grounded in the agentskills.io specification
docs/actor-registry-standard.mdper the approved ADR
skillsfield ontype: llmagents indocs/index.md§4.4 per theapproved ADR
cleveractors.agents(reusing the existing
cleveractors.registryclient)skillsfield and Skill package schemanox -s coverage_reportnox(all default sessions), fix any errorsDefinition of Done
This issue is complete when:
Commit Message in Metadata exactly, followed by a blank line, then additional lines
providing relevant implementation details.
exactly.
master, reviewed, and mergedbefore this issue is marked done.
Note: bundled
scripts/resources are readable, not directly runnableA question came up after this PR landed: if a skill's
instructionssay something like "runscripts/extract.py <file.pdf>", how does thetype: llmagent actually execute that script? Documenting the answer here since it's not obvious from the code alone.What the
skilltool actually gives the model is text, not a runnable file. Callingskill(skill_name="pdf-processing", resource="scripts/extract.py")returns the script's source as a string (cleveractors.agents.tool.ToolAgent._skill_tool, commitbf1f138) — formatted as[SKILL_RESOURCE_READ]...[FILE_CONTENT_START]...[FILE_CONTENT_END]. Nothing is ever written to a real filesystem path; resources live only in the in-memory_loaded_skillsmapping threaded throughcontext["_skills"]. This is intentional, per ADR-2034 D-5: resources are exposed for execution-stage reads "without touching the host filesystem," not for by-path execution.How a bundled Python script can actually run today — no code changes needed, but it requires the model to inline the source rather than reference it by path:
skill(skill_name="pdf-processing", resource="scripts/extract.py")→ returns the source textpython_exec(code="<that source text>")→ executes it viacleveractors.agents.tool.ToolAgent._execute_python_codeThis only works when the agent config sets
exec_python: true. Worth flagging: that sandbox isn't airtight — its restricted-builtins dict still includes an unrestricted__import__, so executed code canimport os/import subprocessand go beyond the tool's documented builtin list. Pre-existing behavior, not something this PR changed, but relevant to anyone relying on it as a security boundary for skill-provided code.What does not work today: a bundled
.shscript, or any Python script that assumes it's a real file on disk (relative imports, sibling files, real argv, real cwd). There's no materialized file forshellor a real interpreter invocation to point at. A model could try to smuggle the whole script intobash -c '<script>'via theshelltool (needsallow_shell: true), but that's fragile and wasn't a designed path — it just happens to be technically possible givenshell's existing arbitrary-commandargument.If genuine file-backed execution is wanted (skill resources materialized to a real temp directory so
shell/python_exec/file_readcan operate on real paths), that's a new capability this issue didn't build. It would need its own small design decision — materialization lifecycle, cleanup, interaction withsafe_mode/unsafe_mode— similar in shape to thepack_skill_directoryfollow-up already flagged in ADR-2034's "Follow-up Required" section. Happy to scope that as a separate issue if it's wanted.