Choose the right primitive
A Skill can teach the model when and how to call a tool, but it does not grant
that tool or bypass its authorization. Likewise, storing a document in a
sandbox does not turn it into a Skill.
A Harness Operation may ask its temporary
scratch loop to activate a relevant Skill, but it cannot attach one. Every
operation inherits the complete catalog already mounted on the parent Agent
version;
activate_skill remains progressive prompt behavior rather than a
hard operation-to-Skill binding.
Version binding and session inheritance
OAO stores Skills in PostgreSQL and binds exact Skill version IDs to immutable agent versions. When you create a session, OAO copies those bindings to the session automatically. You do not send Skills again at session creation.Package contract
Create and version requests use a provider-neutral JSON representation:name and description are the small discovery entry visible to the model.
instructions is the equivalent of the package’s SKILL.md body. Files may
represent references/, templates/, assets/, or scripts/; their relative
paths are preserved. allowedTools is optional compatibility metadata and is
not an authorization control.
Resource workspace
The console provides a small package file manager instead of a single path/content field. You can create folders, create Markdown files, upload multiple.md files, select a file to edit and preview, and remove a file or a
complete folder tree.
references/customers/acme.md means “the acme.md resource inside the
references/customers package folders.” It is not a path on your workstation,
in Daytona, or in the model’s runtime tools.
The MVP editor accepts UTF-8 Markdown files. The direct package API remains
provider-neutral and represents every resource as
{ path, contentType, dataBase64 } in the files array.
Keep the main instructions focused on the procedure and tell the model which
supporting material to consult. Put bulky details that are needed only for some
requests in references. Do not put a rule in a reference if the model must
follow that rule on every activation unless the instructions explicitly require
reading the file.
For example, create references/carrier-codes.md in the workspace with:
references/carrier-codes.md
Drafts and immutable publication
The file manager edits a PostgreSQL-authoritative Skill draft. A draft is a mutable staging resource; it is not available to agents. Publishing validates the complete draft and copies its files atomically into a new immutable Skill version. When you choose Publish new version, OAO clones the selected Skill version into a new draft. Editing, moving, or removing its resources never changes the source version. Empty folders may exist in a draft but are discarded at publication because published package directories are reconstructed from file paths. Draft file contents, hashes, tenant identity, revision, and lifecycle remain in PostgreSQL. Draft operations requireskill:write; reading or listing drafts
requires skill:read. Publication emits the normal skill.created and
skill.version_published events without placing instructions or file contents
in event or audit payloads.
Validation enforces:
- a lowercase, hyphenated Skill name and key;
- no more than 128 resource files;
- no file larger than 5 MiB and no expanded package larger than 10 MiB;
- canonical base64 and a declared media type for every resource;
- normalized, relative paths without
.., backslashes, control characters, empty components, case-folding collisions, or a resource namedSKILL.md; - a SHA-256 for every file and a canonical SHA-256 for the complete version.
Download and upload bundles
The console wraps export in a portable bundle file,<key>-v<version>.skill.json:
- Download on any version of a Skill produces this file from the export route.
- Upload Skill on the Skills page turns a bundle into a new draft; Upload version on a Skill page turns it into a draft of the next version of that Skill, replacing the packaged resources with the bundle’s. Both open the usual review dialog, so nothing is published until you confirm.
- Uploads accept only Markdown resources (
.md,text/markdown); a bundle with other file types, or a file that is not a bundle, is rejected with the reason and no draft is left behind.
Progressive disclosure
OAO uses the Skill primitives in the pinned Flue2.0.3 runtime:
- Admission resolves only the exact Skill versions recorded on the session.
- OAO verifies tenant identity, lifecycle, package hash, file hashes, and byte limits before registering immutable Flue definitions.
- Flue exposes only each Skill’s name and description in its discovery catalog.
- The model calls Flue’s
activate_skillwhen that catalog entry is relevant. Full Markdown instructions become available only at activation. - The model calls
read_skill_resourcefor a supporting file only when it needs that resource.
skill.activated and skill.resource_read events
for debugging; file contents and instructions are not copied into product
events or audit details.
OAO does not discover application Skills from a Daytona workspace. The Flue
filesystem path .agents/skills is hidden from runtime discovery so a mutable
or restored workspace cannot override the PostgreSQL binding. Skill resources
are served from the verified runtime registry; they are not materialized into
the persistent workspace in this MVP.
After activation, Flue lists each supporting file with an exact, read-only
virtual path similar to:
read_skill_resource. The package-relative value entered in the console is the
stable authoring path; Flue adds the runtime prefix when mounting the verified
package. The virtual file is served from the in-memory runtime catalog backed
by PostgreSQL. It is not copied into Daytona, cannot be edited, and is not
visible to shell commands.
Console workflow
- Open Skills and choose Create Skill, or Upload Skill to start from a downloaded bundle.
- Enter a routing-friendly name and description. The description should say what the Skill does and when the model should activate it.
- Write the Markdown instructions.
- In Resource workspace, create package folders and Markdown files, or
select a folder and upload multiple
.mdfiles. Select any file to edit and preview its complete rendered Markdown. - Publish the Skill, then create or publish an agent version and select the exact Skill version to attach.
- Start a session from that agent. The session inherits the binding; do not submit the Skill again.
- Inspect the session timeline for
skill.activatedand, when a reference was needed,skill.resource_read.
Troubleshoot supporting-file reads
If activation succeeds butread_skill_resource reports that the packaged
Skill file was not found, inspect the tool call in the session timeline.
The most common cause is passing the authoring path directly:
Incorrect
Correct
Lifecycle
Every new Skill version startsactive.
activeversions can be attached to a new agent version.deprecatedversions cannot be newly attached, but an existing session may continue using one.revokedversions cannot be attached or admitted to a run. A session that references one fails safely during admission until an operator creates a new session from an agent version with an allowed Skill version.
active to deprecated or revoked, and
deprecated to revoked. Version rows, contents, checksums, agent bindings,
and session bindings are immutable.
Disable or remove a whole Skill
Version lifecycle is per version. Two Skill-level controls cover the whole package, from the row actions in the Skills list, from the Skill page, or through the API:- Disable Skill pauses it. No new agent version can attach any of its versions until the Skill is enabled again. Published agent versions that pin it keep running with it: thread incarnations pin an immutable snapshot of the bound Skill set, so nothing changes mid-session. The agent editor keeps showing a disabled Skill only while the version being edited pins it, so the operator knows to unselect or re-enable it before publishing.
- Remove Skill archives it permanently. The Skill leaves the list and the agent picker, its open drafts are discarded, and its key becomes free for a new Skill. Published versions stay stored because agent versions and session history reference them, so agents that pin them keep working. To also stop existing sessions from using a version, revoke that version.
skill:revoke.
Authorization
Project-scoped actions areskill:read, skill:write, skill:bind, and
skill:revoke. Publishing an agent version also requires agent:write and
validates every selected Skill version within the same tenant transaction.
The console provides API parity for listing and creating Skills, publishing
new versions, deprecating or revoking versions, disabling, enabling, and
removing Skills, selecting exact versions on a new agent version, and viewing
the Skill versions inherited by a session.
Package integrity and startup failures
Publication and runtime activation use the same canonical file ordering when calculating a Skill package hash. New hashes use version 2 serialization with locale-independent UTF-16 code-unit ordering for file paths and object keys. Database collation, ICU settings and resource enumeration order do not change that hash. Activation also accepts version 1 hashes from the original en-US publication runtime using its explicitly pinned legacy ordering; existing immutable packages from that runtime need no migration or republication. Publish only intended source resources. Exclude generated caches such as__pycache__, compiled files and local development artifacts. Verify a published
package by starting an isolated session, in addition to comparing exported bytes.
For a run that has not reserved an admission, if a bound Skill is revoked or fails its package integrity validation during activation, admission
marks the run failed with skill_package_unavailable and a safe explanation.
Cancellation of a run with a durable admission receipt still reconciles and aborts its Flue incarnation, even if its Skill was revoked. An ambiguous dispatch without a receipt still requires activation so a replacement worker can finish admission recovery before aborting. The startup failure path never removes an existing admission or settles a running agent.
It does not leave a new run queued until wake retries are exhausted. Temporary
database failures remain retryable. Genuine corrupt packages require a corrected
Skill and agent version followed by a new session; existing sessions keep their
original version bindings.
Deploy the upgraded worker before the API so it accepts both hash formats before
new version 2 packages can be published. After version 2 packages exist, do not
roll back to a worker that only understands version 1.
